diff --git a/.gitignore b/.gitignore index 20247e61be..611dd73e9a 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,7 @@ logs/ /ios/src/io/anuke/mindustry/gen/ /core/src/io/anuke/mindustry/gen/ ios/robovm.properties +config/ *.gif version.properties diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index 8fdb041fc7..b0e4475812 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -20,7 +20,7 @@ diff --git a/build.gradle b/build.gradle index 147a1be3fb..582c186e19 100644 --- a/build.gradle +++ b/build.gradle @@ -8,12 +8,11 @@ buildscript { } dependencies { classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.0' - classpath "com.badlogicgames.gdx:gdx-tools:1.9.8" + classpath "com.badlogicgames.gdx:gdx-tools:1.9.9" } } allprojects { - apply plugin: "eclipse" apply plugin: "idea" version = 'release' @@ -21,11 +20,11 @@ allprojects { ext { versionNumber = '4' versionModifier = 'alpha' - versionType = 'official' + if (!project.hasProperty("versionType")) versionType = 'official' appName = 'Mindustry' gdxVersion = '1.9.9' roboVMVersion = '2.3.0' - uCoreVersion = '7eb80a9765557d025d589f28fa1910dffa3fc8ed' + uCoreVersion = '5871d2d0385370bc937fed3e5e301d6962a50476' getVersionString = { String buildVersion = getBuildVersion() @@ -105,17 +104,19 @@ project(":ios") { apply plugin: "robovm" task copyGen{ - copy{ - from ("core/build/classes/java/main/io/anuke/mindustry/gen/"){ - include "**/*.java" - } + doLast { + copy { + from("../core/build/classes/java/main/io/anuke/mindustry/gen/") { + include "**/*.java" + } - into "core/src/io/anuke/mindustry/gen" + into "../core/src/io/anuke/mindustry/gen" + } } doFirst{ delete{ - delete "core/src/io/anuke/mindustry/gen/" + delete "../core/src/io/anuke/mindustry/gen/" } } } @@ -133,7 +134,7 @@ project(":ios") { props['app.mainclass'] = 'io.anuke.mindustry.IOSLauncher' props['app.executable'] = 'IOSLauncher' props['app.name'] = 'Mindustry' - props['app.build'] = (!props.hasProperty("app.build") ? 40 : props['app.build'].toInteger() + 1)+"" + props['app.build'] = (!props.containsKey("app.build") ? 40 : props['app.build'].toInteger() + 1)+"" props.store(vfile.newWriter(), null) } @@ -149,7 +150,7 @@ project(":ios") { compile "com.badlogicgames.gdx:gdx-backend-robovm:$gdxVersion" compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-ios" compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-ios" - compileOnly project(":annotations") + //compileOnly project(":annotations") } } diff --git a/core/assets-raw/sprites/ui/button-left-down.9.png b/core/assets-raw/sprites/ui/button-left-down.9.png deleted file mode 100644 index a8d4d637d2..0000000000 Binary files a/core/assets-raw/sprites/ui/button-left-down.9.png and /dev/null differ diff --git a/core/assets-raw/sprites/ui/button-left-over.9.png b/core/assets-raw/sprites/ui/button-left-over.9.png deleted file mode 100644 index e6727f11bd..0000000000 Binary files a/core/assets-raw/sprites/ui/button-left-over.9.png and /dev/null differ diff --git a/core/assets-raw/sprites/ui/button-left.9.png b/core/assets-raw/sprites/ui/button-left.9.png deleted file mode 100644 index a3e813eefb..0000000000 Binary files a/core/assets-raw/sprites/ui/button-left.9.png and /dev/null differ diff --git a/core/assets-raw/sprites/ui/icons/icon-copy.png b/core/assets-raw/sprites/ui/icons/icon-copy.png new file mode 100644 index 0000000000..b1a8d0a607 Binary files /dev/null and b/core/assets-raw/sprites/ui/icons/icon-copy.png differ diff --git a/core/assets-raw/sprites/ui/icons/icon-paste.png b/core/assets-raw/sprites/ui/icons/icon-paste.png new file mode 100644 index 0000000000..1ddee0eb9b Binary files /dev/null and b/core/assets-raw/sprites/ui/icons/icon-paste.png differ diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 55a215f9cc..ab0e7e3510 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -133,7 +133,7 @@ text.confirmunban = Are you sure you want to unban this player? text.confirmadmin = Are you sure you want to make this player an admin? text.confirmunadmin = Are you sure you want to remove admin status from this player? text.joingame.title = Join Game -text.joingame.ip = IP: +text.joingame.ip = Address: text.disconnect = Disconnected. text.disconnect.data = Failed to load world data! text.connecting = [accent]Connecting... @@ -409,14 +409,16 @@ keybind.chat_scroll.name = Chat scroll keybind.drop_unit.name = drop unit keybind.zoom_minimap.name = Zoom minimap mode.text.help.title = Description of modes -mode.waves.name = waves -mode.waves.description = the normal mode. limited resources and automatic incoming waves. -mode.sandbox.name = sandbox -mode.sandbox.description = infinite resources and no timer for waves. -mode.freebuild.name = freebuild -mode.freebuild.description = limited resources and no timer for waves. +mode.waves.name = Waves +mode.waves.description = The normal mode. Limited resources and automatic incoming waves. +mode.sandbox.name = Sandbox +mode.sandbox.description = Infinite resources and no timer for waves. +mode.freebuild.name = Freebuild +mode.freebuild.description = Limited resources and no timer for waves. mode.pvp.name = PvP -mode.pvp.description = fight against other players locally. +mode.pvp.description = Fight against other players locally. +mode.attack.name = Attack +mode.attack.descrption = No waves, with the goal to destroy the enemy base. content.item.name = Items content.liquid.name = Liquids content.unit.name = Units diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index a8d9fa9b3e..cd975d0fb1 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -493,7 +493,7 @@ text.mech.ability = [LIGHT_GRAY]Hablidad: {0} text.liquid.heatcapacity = [LIGHT_GRAY]Capacidad Térmica: {0} text.liquid.viscosity = [LIGHT_GRAY]Viscosidad: {0} text.liquid.temperature = [LIGHT_GRAY]Temperatura: {0} -block.constructing = {0}\n[LIGHT_GRAY](Constructing) +block.constructing = {0}\n[LIGHT_GRAY](Construyendo) block.spawn.name = Punto de generación block.core.name = Núcleo block.metalfloor.name = Suelo de Metal diff --git a/core/assets/bundles/bundle_fr_BE.properties b/core/assets/bundles/bundle_fr_BE.properties index 1abdc7f293..1e2cf89a15 100644 --- a/core/assets/bundles/bundle_fr_BE.properties +++ b/core/assets/bundles/bundle_fr_BE.properties @@ -349,6 +349,7 @@ text.category.items = Objets text.category.crafting = Fabrication text.category.shooting = Défense text.category.optional = Améliorations facultatives +setting.indicators.name = Indicateurs d'alliés setting.autotarget.name = Visée automatique setting.fpscap.name = Max FPS setting.fpscap.none = Vide @@ -437,9 +438,9 @@ item.silicon.description = Un matériau semi-conducteur extrêmement utile, avec item.plastanium.name = Plastanium item.plastanium.description = Un matériau léger et docile utilisé dans l'aviation avancée et dans les munitions à fragmentation. item.phase-fabric.name = Phase Fabric -item.phase-fabric.description = A near-weightless substance used in advanced electronics and self-repairing technology. +item.phase-fabric.description = Une substance presque en apesanteur utilisée dans l'électronique de pointe et la technologie autoréparable. item.surge-alloy.name = Alliage superchargé -item.surge-alloy.description = An advanced alloy with unique electrical properties. +item.surge-alloy.description = Un alliage avancé aux propriétés électriques uniques. item.biomatter.name = Biomasse item.biomatter.description = Un mélange de matières organiques; utilisé pour la transformation en pétrole ou en tant que carburant de base. item.sand.name = Sable @@ -463,7 +464,7 @@ mech.delta-mech.description = Un mécha rapide avec une armure légère fait pou mech.tau-mech.name = Tau mech.tau-mech.weapon = Laser restructurant mech.tau-mech.ability = Explosion réparante -mech.tau-mech.description = Un mécha de support. Soigne les blocs alliés en tirant dessus. Il peut aussi éteindre les feux et soigner ses alliés en zone avec sa compétence. +mech.tau-mech.description = Le support technique. Soigne les blocs alliés en leur tirant dessus. Peut soigner les alliés dans un rayon grâce à sa capacité de réparation. mech.omega-mech.name = Omega mech.omega-mech.weapon = Essaim de missiles auto-guidés mech.omega-mech.ability = Armure diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index d663e8f5ac..cb44f65e08 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -2,15 +2,15 @@ text.credits.text = Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[ text.credits = Creditos text.discord = Junte-se ao Discord do Mindustry! (Lá nós falamos em inglês) text.link.discord.description = O discord oficial do Mindustry -text.link.github.description = Game source code +text.link.github.description = Codigo fonte do jogo. text.link.dev-builds.description = Desenvolvimentos Instaveis text.link.trello.description = Trello Oficial para Updates Planejados text.link.itch.io.description = Pagina da Itch.io com os Downloads -text.link.google-play.description = Google Play store listing +text.link.google-play.description = Listamento do google play store text.link.wiki.description = Wiki oficial do Mindustry text.linkfail = Falha ao abrir o link\nO Url foi copiado text.gameover = O núcleo foi destruído. -text.gameover.pvp = The[accent] {0}[] team is victorious! +text.gameover.pvp = O time[accent] {0}[] É vitorioso! text.sector.gameover = Esse setor foi perdido! Soltar Novamente? text.sector.retry = Tentar novamente? text.highscore = [YELLOW]Novo recorde! @@ -20,11 +20,11 @@ text.level.delete.title = Confirmar exclusão text.map.delete = Certeza que quer deletar o mapa "[accent]{0}[]"? text.level.select = Seleção de Fase text.level.mode = Modo de Jogo: -text.construction.desktop = Desktop controls have been changed.\nTo deselect a block or stop building, [accent]use space[]. +text.construction.desktop = Os controles do Desktop foram Mudados.\nPara descelecionar um bloco ou parar de construir, [accent]Use espaço.[]. text.construction.title = Guia de contrução de blocos -text.construction = You've just selected [accent]block construction mode[].\n\nTo begin placing, simply tap a valid location near your ship.\nOnce you have selected some blocks, press the checkbox to confirm, and your ship will begin constructing them.\n\n- [accent]Remove blocks[] from your selection by tapping them.\n- [accent]Shift the selection[] by holding and dragging any block in the selection.\n- [accent]Place blocks in a line[] by tapping and holding an empty spot, then dragging in a direction.\n- [accent]Cancel construction or selection[] by pressing the X at the bottom left. +text.construction =Você selecionou [accent]Modo de construção de blocos[].\n\nPara começar a colocar, Simplesmente clique um lugar valido perto de sua nave.\nUma vez que você selecionou alguns blocos, Clique na caixa para confirmar, E sua nave vai começar a construi-los.\n\n- [accent]Remova blocos[] De sua seleção clicando neles.\n- [accent]Mude a seleção[] Segurando e arrastando qualquer bloco na seleção.\n- [accent]Coloque os blocos em linha[] Clicando e segurando em um lugar vazio e arrastando em uma direção.\n- [accent]Cancele a construção ou seleção[] Pressionando X no canto esquerdo. text.deconstruction.title = Block Deconstruction Guide -text.deconstruction = You've just selected [accent]block deconstruction mode[].\n\nTo begin breaking, simply tap a block near your ship.\nOnce you have selected some blocks, press the checkbox to confirm, and your ship will begin de-constructing them.\n\n- [accent]Remove blocks[] from your selection by tapping them.\n- [accent]Remove blocks in an area[] by tapping and holding an empty spot, then dragging in a direction.\n- [accent]Cancel deconstruction or selection[] by pressing the X at the bottom left. +text.deconstruction = Você selecionou [accent]O modo de destruição de blocos[].\n\nPara Começar a quebrar, Simplesmente clique num bloco perto da nave.\nQuando tiver selecionados alguns blocos, Aperte a caixa para confirmar, E sua nave vai começar a construir.\n\n- [accent]Remova blocos[] De sua seleção clicando neles.\n- [accent]Remova blocos em uma area[] Clicando e Apertando um lugar vazio então arraste numa direção.\n- [accent]Cancele a construção ou Seleção[] Apertando X no canto Esquerdo. text.showagain = Não mostrar na proxima sessão text.coreattack = < A base está sobre ataque! > text.unlocks = Desbloqueados @@ -37,31 +37,31 @@ text.sectors = Setores text.sector = Setor Selecionado: [LIGHT_GRAY]{0} text.sector.time = Tempo: [LIGHT_GRAY]{0} text.sector.deploy = Soltar -text.sector.abandon = Abandon -text.sector.abandon.confirm = Are you sure you want to abandon all progress at this sector?\nThis cannot be undone! +text.sector.abandon = Abandonar +text.sector.abandon.confirm = Certeza que quer abandonar seu progresso nesse setor?\nThis cannot be undone! text.sector.resume = Voltar -text.sector.locked = [scarlet][[Incomplete] -text.sector.unexplored = [accent][[Unexplored] -text.missions = Missions:[LIGHT_GRAY] {0} +text.sector.locked = [scarlet][[Não liberado] +text.sector.unexplored = [accent][[Inexplorado] +text.missions = Missões:[LIGHT_GRAY] {0} text.mission = Missão:[LIGHT_GRAY] {0} -text.mission.main = Main Mission:[LIGHT_GRAY] {0} -text.mission.info = Mission Info -text.mission.complete = Mission complete! -text.mission.complete.body = Sector {0},{1} has been conquered. +text.mission.main = Missão principal:[LIGHT_GRAY] {0} +text.mission.info = Info da missão +text.mission.complete = Missão completa! +text.mission.complete.body = Setor {0},{1} Foi conquistado. text.mission.wave = Sobrevive [accent]{0}/{1}[] Onda\nOnda em {2} -text.mission.wave.enemies = Survive[accent] {0}/{1} []waves\n{2} Enemies -text.mission.wave.enemy = Survive[accent] {0}/{1} []waves\n{2} Enemy -text.mission.wave.menu = Survive[accent] {0} []waves +text.mission.wave.enemies = Sobreviva[accent] {0}/{1} []ondas\n{2} inimigos +text.mission.wave.enemy = Sobreviva[accent] {0}/{1} []Ondas\n{2} Inimigos +text.mission.wave.menu = Sobreviva[accent] {0} []Ondas text.mission.battle = Destrua a base inimiga. -text.mission.resource.menu = Obtain {0} x{1} -text.mission.resource = Obtain {0}:\n[accent]{1}/{2}[] -text.mission.block = Create {0} -text.mission.unit = Create {0} Unit -text.mission.command = Send Command {0} To Units -text.mission.linknode = Link Power Node -text.mission.display = [accent]Mission:\n[LIGHT_GRAY]{0} -text.mission.mech = Switch to mech[accent] {0}[] -text.mission.create = Create[accent] {0}[] +text.mission.resource.menu = Obtenha {0} x{1} +text.mission.resource = Obtenha {0}:\n[accent]{1}/{2}[] +text.mission.block = Criar {0} +text.mission.unit = Criar {0} Unidade +text.mission.command = Enviar comando {0} As unidades +text.mission.linknode = Ligar nodo de energia +text.mission.display = [accent]Missão:\n[LIGHT_GRAY]{0} +text.mission.mech = Trocar para Meca[accent] {0}[] +text.mission.create = Criar[accent] {0}[] text.none = text.close = Fechar text.quit = Sair @@ -71,16 +71,16 @@ text.nextmission = Próxima Missão text.maps.none = [LIGHT_GRAY]Nenhum Mapa Encontrado! text.about.button = Sobre text.name = Nome: -text.filename = File Name: +text.filename = Nome do arquivo: text.unlocked = Novo bloco Desbloqueado! text.unlocked.plural = Novos Blocos desbloqueados! text.players = {0} Jogadores Ativos text.players.single = {0} Jogador Ativo text.server.closing = [accent]Fechando servidor... text.server.kicked.kick = Voce foi expulso do servidor! -text.server.kicked.serverClose = Server closed. -text.server.kicked.sectorComplete = Sector completed. -text.server.kicked.sectorComplete.text = Your mission is complete.\nThe server will now continue at the next sector. +text.server.kicked.serverClose = Servidor Fechado. +text.server.kicked.sectorComplete = Setor completo. +text.server.kicked.sectorComplete.text = Sua missão esta completa.\nO servidor vai continuar no proximo setor. text.server.kicked.clientOutdated = Cliente desatualizado! Atualize seu jogo! text.server.kicked.serverOutdated = Servidor desatualiado! Peca ao dono para atualizar! text.server.kicked.banned = Voce foi banido do servidor. @@ -90,9 +90,9 @@ text.server.kicked.nameEmpty = Voce deve ter pelo menos uma letra ou numero. text.server.kicked.idInUse = Voce ja esta neste servidor! Conectar com duas contas não é permitido. text.server.kicked.customClient = Este servidor não suporta construções customizadas. Baixe a versão original. text.host.info = The [accent]Hospedar[]Botão Hopeda um servidor no Host[scarlet]6567[] e [scarlet]6568.[]\nQualquer um no [LIGHT_GRAY]Wi-fi Ou Internet local[] Pode ver este servidor na lista de servidores.\n\nSe voce quer poder entrar em qualquer servidor em seu ip, [accent]port forwarding[] é requerido.\n\n[LIGHT_GRAY]Note: Se alguem esta com problemas em conectar no seu servidor lan, Tenha certeza que deixou mindustry Acessar sua internet local nas configurações de firewall -text.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. +text.join.info = Aqui, Você pode entar em um [accent]IP De servidor[] Para conectar, Ou descobrir [accent]Servidores[] Da rede local.\nAmbos os servidores LAN e WAN São suportados.\n\n[LIGHT_GRAY]Note: Não tem uma lista de servidores automaticos; Se você quer conectar ao IP de alguem, Você precisa pedir o IP Ao Rosteador. text.hostserver = Hospedar servidor -text.hostserver.mobile = Host\nGame +text.hostserver.mobile = Hospedar\nJogo text.host = Hospedar text.hosting = [accent]Abrindo server... text.hosts.refresh = atualizar @@ -103,7 +103,7 @@ text.host.invalid = [scarlet]Não foi possivel Hospedar. text.trace = Traçar jogador text.trace.playername = Nome do jogador: [accent]{0} text.trace.ip = IP: [accent]{0} -text.trace.id = Unique ID: [accent]{0} +text.trace.id = ID unico: [accent]{0} text.trace.android = Cliente Androide: [accent]{0} text.trace.modclient = Cliente Customizado: [accent]{0} text.trace.totalblocksbroken = Blocos totais quebrados: [accent]{0} @@ -125,7 +125,7 @@ text.server.outdated.client = [crimson]Cliente desatualizado![] text.server.version = [lightgray]Versão: {0} text.server.custombuild = [yellow]Construção customizada text.confirmban = Certeza que quer banir este jogador? -text.confirmkick = Are you sure you want to kick this player? +text.confirmkick = Certeza que quer kickar o jogador? text.confirmunban = Certeza que quer desbanir este jogador? text.confirmadmin = Certeza que quer fazer este jogador um administrador? text.confirmunadmin = Certeza que quer remover o estatus de adminstrador deste jogador? @@ -201,9 +201,9 @@ text.builtin = Built-In text.map.delete.confirm = Certeza que quer deletar este mapa? Isto não pode ser desfeito! text.map.random = [accent]Mapa aleatório text.map.nospawn = Esse mapa não contém um [yellow]core[] para o jogador Nascer! [ROYAL]blue[] Coloque um [yellow]core[] no editor de mapa. -text.map.nospawn.pvp = This map does not have any enemy cores for player to spawn into! Add[SCARLET] red[] cores to this map in the editor. -text.map.invalid = Error loading map: corrupted or invalid map file. -text.editor.brush = Brush +text.map.nospawn.pvp = Esse mapa não tem cores inimigos para os jogadores nascerem! Adicione[SCARLET] Cores vermelhos[] no mapa no editor. +text.map.invalid = Erro ao carregar o mapa: Arquivo de mapa invalido ou corrupto. +text.editor.brush = Pincel text.editor.slope = \\ text.editor.openin = Abrir no Editor text.editor.oregen = Geração de minério @@ -260,13 +260,13 @@ text.editor = Editor text.mapeditor = Editor de mapa text.donate = Doar text.connectfail = [crimson]Falha ao entrar no servidor: [accent]{0} -text.error.unreachable = Server unreachable. -text.error.invalidaddress = Invalid address. -text.error.timedout = Timed out!\nMake sure the host has port forwarding set up, and that the address is correct! -text.error.mismatch = Packet error:\npossible client/server version mismatch.\nMake sure you and the host have the latest version of Mindustry! -text.error.alreadyconnected = Already connected. -text.error.mapnotfound = Map file not found! -text.error.any = Unkown network error. +text.error.unreachable = Servidor inalcançavel. +text.error.invalidaddress = Endereço invalido. +text.error.timedout = Desconectado!\nTenha certeza que o Rosteador tenha feito Port forwading, E que o indereço esteja correto! +text.error.mismatch = Erro de pacote:\nPossivel versão do cliente/Servidor incompatibilidade.\nTenha certeza que você e o host tenham a ultima versão! +text.error.alreadyconnected = Já conectado. +text.error.mapnotfound = Arquivo de mapa não encontrado! +text.error.any = Erro de rede desconhecido. text.settings.language = Linguagem text.settings.reset = Restaurar Padrões text.settings.rebind = Religar @@ -274,12 +274,12 @@ text.settings.controls = Controles text.settings.game = Jogo text.settings.sound = Som text.settings.graphics = Gráficos -text.settings.cleardata = Clear Game Data... -text.settings.clear.confirm = Are you sure you want to clear this data?\nWhat is done cannot be undone! -text.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. -text.settings.clearsectors = Clear Sectors -text.settings.clearunlocks = Clear Unlocks -text.settings.clearall = Clear All +text.settings.cleardata = Data do jogo limpa... +text.settings.clear.confirm = Certeza que quer limpar a data?\nOque é feito não pode ser desfeito! +text.settings.clearall.confirm = [scarlet]Aviso![]\nIsso vai limpar toda a data, Incluindo saves, mapas, Keybinds e desbloqueados.\nQuando apertar 'ok' Vai apagar toda a data e sair automaticamente. +text.settings.clearsectors = Limpar setores +text.settings.clearunlocks = Limpar liberados +text.settings.clearall = Limpar tudo text.paused = Pausado text.yes = Sim text.no = Não @@ -298,11 +298,11 @@ text.blocks.liquidcapacity = Capacidade de Líquido text.blocks.maxitemssecond = Máximo de itens/segundo text.blocks.powerrange = Alcance da Energia text.blocks.poweruse = Uso de energia -text.blocks.powerdamage = Power/Damage +text.blocks.powerdamage = Dano/Poder text.blocks.inputitemcapacity = Configurar capacidade de itens text.blocks.outputitemcapacity = Configurar capacidade de itens text.blocks.itemcapacity = Capacidade de Itens -text.blocks.basepowergeneration = Base Power Generation +text.blocks.basepowergeneration = Geração de poder base text.blocks.powertransferspeed = Transferência de energia text.blocks.craftspeed = Velocidade de produção text.blocks.inputliquid = Líquido de entrada @@ -313,14 +313,14 @@ text.blocks.outputitem = Itens de saida text.blocks.drilltier = Furaveis text.blocks.drillspeed = Velocidade da furadeira base text.blocks.liquidoutput = Saida de liquido -text.blocks.liquidoutputspeed = Liquid Output Speed +text.blocks.liquidoutputspeed = Velocidade da saida de líquido text.blocks.liquiduse = Uso de liquido text.blocks.coolant = Esfriador text.blocks.coolantuse = Uso do esfriador text.blocks.inputliquidfuel = Liquido de combustivel text.blocks.liquidfueluse = Uso do liquido de combustivel -text.blocks.boostitem = Boost Item -text.blocks.boostliquid = Boost Liquid +text.blocks.boostitem = Acelerar item +text.blocks.boostliquid = Acelerar líquido text.blocks.health = Saúde text.blocks.inaccuracy = Imprecisão text.blocks.shots = Tiros @@ -345,12 +345,12 @@ text.category.liquids = Liquidos text.category.items = Itens text.category.crafting = Construindo text.category.shooting = Atirando -text.category.optional = Optional Enhancements -setting.autotarget.name = Auto-Target +text.category.optional = Melhoras opcionais +setting.autotarget.name = Alvo automatico setting.fpscap.name = FPS Maximo setting.fpscap.none = Nenhum setting.fpscap.text = {0} FPS -setting.difficulty.training = training +setting.difficulty.training = treinamento setting.difficulty.easy = Fácil setting.difficulty.normal = Normal setting.difficulty.hard = Difícil @@ -370,21 +370,21 @@ setting.musicvol.name = Volume da Música setting.mutemusic.name = Desligar Música setting.sfxvol.name = Volume de Efeitos setting.mutesound.name = Desligar Som -setting.crashreport.name = Send Anonymous Crash Reports +setting.crashreport.name = Enviar denuncias de crash anonimas text.keybind.title = Refazer teclas -category.general.name = General -category.view.name = View -category.multiplayer.name = Multiplayer -command.attack = Attack -command.retreat = Retreat -command.patrol = Patrol -keybind.press = Press a key... -keybind.press.axis = Press an axis or key... -keybind.move_x.name = move_x -keybind.move_y.name = move_y +category.general.name = Geral +category.view.name = Ver +category.multiplayer.name = Multijogador +command.attack = Atacar +command.retreat = Recuar +command.patrol = Patrulha +keybind.press = Pressione uma tecla... +keybind.press.axis = Pressione uma Axis ou tecla... +keybind.move_x.name = mover_x +keybind.move_y.name = mover_y keybind.select.name = selecionar keybind.break.name = quebrar -keybind.deselect.name = Deselect +keybind.deselect.name = Deselecionar keybind.shoot.name = Atirar keybind.zoom_hold.name = segurar_zoom keybind.zoom.name = zoom @@ -396,49 +396,49 @@ keybind.player_list.name = Lista_de_jogadores keybind.console.name = console keybind.rotate.name = girar 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.chat_history_prev.name = Historico do chat anterior +keybind.chat_history_next.name = Historico do proximo chat +keybind.chat_scroll.name = Rolar chat +keybind.drop_unit.name = Soltar unidade keybind.zoom_minimap.name = Zoom minimap mode.text.help.title = Descrição dos modos mode.waves.name = hordas mode.waves.description = O modo normal. Recursos limitados E os ataques vem automaticamente. -mode.sandbox.name = sandbox +mode.sandbox.name = Caixa de areia mode.sandbox.description = Recursos infinitos E sem tempo para Ataques. mode.freebuild.name = construção \nlivre mode.freebuild.description = recursos limitados e Sem tempo para Ataques. mode.pvp.name = PvP -mode.pvp.description = fight against other players locally. +mode.pvp.description = Lutar contra outros jogadores locais. content.item.name = Itens content.liquid.name = Liquidos content.unit.name = Units content.recipe.name = Blocos -content.mech.name = Mechs +content.mech.name = Mecas item.stone.name = Pedra item.stone.description = Um Material Incomum Cru. Usado para separar e refinar Em outros materiais,Ou Derreter em Lava. item.copper.name = Cobre -item.copper.description = A useful structure material. Used extensively in all types of blocks. +item.copper.description = Um material de estrutura util. Usado extensivamente em Maioria dos blocos. item.lead.name = Chumbo item.lead.description = Material de comeco basico. usado intensivamente em Blocos de transporte de liquidos e eletronicos. item.coal.name = Carvão item.coal.description = Combustivel pronto. -item.dense-alloy.name = Dense Alloy -item.dense-alloy.description = A tough alloy made with lead and copper. Used in advanced transportation blocks and high-tier drills. +item.dense-alloy.name = Liga densa +item.dense-alloy.description = Uma liga densa de chumbo e cobre. Usado na transportação de blocos e mineradoras de alto nivel. item.titanium.name = Titânio item.titanium.description = Um Material raro super leve, metal usado intensivamente na transportação de líquidos, Brocas e Aeronaves. item.thorium.name = Urânio -item.thorium.description = A dense, radioactive metal used as structural support and nuclear fuel. +item.thorium.description = Um metal denso e radioativo, Usado como suporte material e combustivel nuclear. item.silicon.name = Sílicio item.silicon.description = Condutor extremamente importante,Com aplicação em paneis solares e dispositivos complexos. item.plastanium.name = Plastanio item.plastanium.description = Leve, Material dutil Usado em aeronaves Avançadas E munição de fragmentação. -item.phase-fabric.name = Phase Fabric -item.phase-fabric.description = A near-weightless substance used in advanced electronics and self-repairing technology. +item.phase-fabric.name = Fabrica fase +item.phase-fabric.description = Uma substancia quase sem peso Usado em eletronica avançada E tecnologia de auto-reparo. item.surge-alloy.name = Liga de surto -item.surge-alloy.description = An advanced alloy with unique electrical properties. +item.surge-alloy.description = Uma liga com propriedades unicas eletricas. item.biomatter.name = Biomateria -item.biomatter.description = A clump of organic mush; used for conversion into oil or as a basic fuel. +item.biomatter.description = Um monte de materia organica; Usado na conversão de oleo Ou como oleo basico. item.sand.name = Areia item.sand.description = Um material comum Que é usado intensivamente em derretimento, Tanto em ligas como fluxo. item.blast-compound.name = Composto de explosão @@ -449,54 +449,54 @@ liquid.water.name = Água liquid.lava.name = Lava liquid.oil.name = Petróleo liquid.cryofluid.name = Crio Fluido -mech.alpha-mech.name = Alpha -mech.alpha-mech.weapon = Heavy Repeater -mech.alpha-mech.ability = Drone Swarm -mech.alpha-mech.description = The standard mech. Has decent speed and damage output; can create up to 3 drones for increased offensive capability. +mech.alpha-mech.name = Alfa +mech.alpha-mech.weapon = Repetidor pesado +mech.alpha-mech.ability = Onda de drones +mech.alpha-mech.description = O meca padrão. Tem uma saida de dano e velocidade decente; Pode criar até 3 drones Para capacidades ofensivas aumentadas. mech.delta-mech.name = Delta -mech.delta-mech.weapon = Arc Generator -mech.delta-mech.ability = Discharge -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.delta-mech.weapon = Gerador Arc +mech.delta-mech.ability = Descarga +mech.delta-mech.description = Um meca rapido, De baixa armadura Feito for para ataques rapidos. Da pouco dano as estruturas, Mas pode matar grandes grupos de unidades inimigas muito rapidamente Com sua arma ARC. mech.tau-mech.name = Tau -mech.tau-mech.weapon = Restruct Laser -mech.tau-mech.ability = Repair Burst -mech.tau-mech.description = The support mech. Heals allied blocks by shooting at them. Can extinguish fires and heal allies in a radius with its repair ability. +mech.tau-mech.weapon = Laser restruturador +mech.tau-mech.ability = Tiro reparador +mech.tau-mech.description = O meca de suporte. Conserta blocos aliados Atirando neles. Pode extinguir o fogo e consertar aliados em uma distancia Com sua habilidade de consertar. mech.omega-mech.name = Omega -mech.omega-mech.weapon = Swarm Missiles -mech.omega-mech.ability = Armored Configuration -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.name = Dart -mech.dart-ship.weapon = Repeater -mech.dart-ship.description = The standard ship. Reasonably fast and light, but has little offensive capability and low mining speed. +mech.omega-mech.weapon = Onda de missies +mech.omega-mech.ability = Configuração Armadurada +mech.omega-mech.description = Um meca volumoso e bem armadurado, Feito para assaltos da primeira linha. Sua habilidade de armadura Pode bloquear 90% de dano. +mech.dart-ship.name = Dardo +mech.dart-ship.weapon = Repetidor +mech.dart-ship.description = Nave padrão. Consideravelmente leve e rapido, Tem pouca capacidade ofensiva E baixa velocidade de mineração. mech.javelin-ship.name = Javelin -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.javelin-ship.weapon = Burst Missiles -mech.javelin-ship.ability = Discharge Booster -mech.trident-ship.name = Trident -mech.trident-ship.description = A heavy bomber. Reasonably well armored. -mech.trident-ship.weapon = Bomb Bay +mech.javelin-ship.description = Uma nave de espinhos de atacar e correr. Quando inicialmente lento, pode acelerar a altas velocidades e voar até bases inimigas, Dando altas quantidades de dano Com seus raios e habilidades. +mech.javelin-ship.weapon = Ondas de misseis +mech.javelin-ship.ability = Acelerador de explosão +mech.trident-ship.name = Tridente +mech.trident-ship.description = Um bombardeiro pesado. Consideravelmente bem armadurado. +mech.trident-ship.weapon = Carga de bombas mech.glaive-ship.name = Glaive -mech.glaive-ship.description = A large, well-armored gunship. Equipped with an incendiary repeater. Good acceleration and maximum speed. -mech.glaive-ship.weapon = Flame Repeater +mech.glaive-ship.description = Uma nave armada, bem armadurada. Com um repetidor incendario equipado. Boa aceleração e maxima velocidade. +mech.glaive-ship.weapon = Repetidor de fogo text.item.explosiveness = [LIGHT_GRAY]Explosividade: {0} text.item.flammability = [LIGHT_GRAY]Inflamabilidade: {0} text.item.radioactivity = [LIGHT_GRAY]RadioAtividade: {0} text.item.fluxiness = [LIGHT_GRAY]Poder do fluxo: {0} -text.unit.health = [LIGHT_GRAY]Health: {0} -text.unit.speed = [LIGHT_GRAY]Speed: {0} -text.mech.weapon = [LIGHT_GRAY]Weapon: {0} -text.mech.armor = [LIGHT_GRAY]Armor: {0} -text.mech.itemcapacity = [LIGHT_GRAY]Item Capacity: {0} -text.mech.minespeed = [LIGHT_GRAY]Mining Speed: {0} -text.mech.minepower = [LIGHT_GRAY]Mining Power: {0} -text.mech.ability = [LIGHT_GRAY]Ability: {0} +text.unit.health = [LIGHT_GRAY]Vida: {0} +text.unit.speed = [LIGHT_GRAY]Velocidade: {0} +text.mech.weapon = [LIGHT_GRAY]Arma: {0} +text.mech.armor = [LIGHT_GRAY]Armadura: {0} +text.mech.itemcapacity = [LIGHT_GRAY]Capacidade de itens: {0} +text.mech.minespeed = [LIGHT_GRAY]Velocidade de mineração: {0} +text.mech.minepower = [LIGHT_GRAY]Poder de mineração: {0} +text.mech.ability = [LIGHT_GRAY]Habilidade: {0} text.liquid.heatcapacity = [LIGHT_GRAY]Capacidade de aquecimento: {0} text.liquid.viscosity = [LIGHT_GRAY]Viscosidade: {0} text.liquid.temperature = [LIGHT_GRAY]Temperatura: {0} -block.constructing = {0}\n[LIGHT_GRAY](Constructing) -block.spawn.name = Enemy Spawn +block.constructing = {0}\n[LIGHT_GRAY](Construindo) +block.spawn.name = Spawn dos inimigos block.core.name = Core -block.metalfloor.name = Metal Floor +block.metalfloor.name = Chão de metal block.deepwater.name = água funda block.water.name = água block.lava.name = lava @@ -508,24 +508,24 @@ block.sand.name = areia block.ice.name = gelo block.snow.name = neve block.grass.name = grama -block.shrub.name = shrub +block.shrub.name = Arbusto block.rock.name = rocha block.blackrock.name = rocha negra block.icerock.name = rocha de gelo block.copper-wall.name = Parede de Cobre block.copper-wall-large.name = Parede de Cobre Grande -block.dense-alloy-wall.name = Dense Alloy Wall -block.dense-alloy-wall-large.name = Large Dense Alloy Wall -block.phase-wall.name = Phase Wall -block.phase-wall-large.name = Large Phase Wall +block.dense-alloy-wall.name = Parede de liga densa +block.dense-alloy-wall-large.name = Parede de liga densa grande +block.phase-wall.name = Parede de fase +block.phase-wall-large.name = Parde de fase grande block.thorium-wall.name = Parede de tório block.thorium-wall-large.name = Parede larga de tório block.door.name = Porta block.door-large.name = Porta Grande -block.duo.name = Duplo -block.scorch.name = Quimar +block.duo.name = Dupla +block.scorch.name = Queimar block.hail.name = Hail -block.lancer.name = Lancer +block.lancer.name = Lancador block.conveyor.name = Esteira block.titanium-conveyor.name = Esteira de Titanio block.junction.name = Junção @@ -553,21 +553,21 @@ block.battery-large.name = Bateria Grande block.combustion-generator.name = Gerador de combustão block.turbine-generator.name = Gerador de Turbina block.mechanical-drill.name = Furadera Mecânica -block.pneumatic-drill.name = Pneumatic Drill +block.pneumatic-drill.name = Mineradora Pneumatica block.laser-drill.name = Broca a Laser block.water-extractor.name = Extrator de Agua block.cultivator.name = Cultivador -block.alpha-mech-pad.name = Alpha Mech Pad -block.dart-ship-pad.name = Dart Ship 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.alpha-mech-pad.name = Controle do meca Alfa +block.dart-ship-pad.name = Controle do meca Dart +block.delta-mech-pad.name = Controle do meca Delta +block.javelin-ship-pad.name = Controle do meca Javelin +block.trident-ship-pad.name = Controle do meca Tridente +block.glaive-ship-pad.name = Controle do meca Glaive +block.omega-mech-pad.name = Controle do meca Omega +block.tau-mech-pad.name = Controle do meca Tau block.conduit.name = Cano block.mechanical-pump.name = Bomba Mecanica -block.itemsource.name = Item Source +block.itemsource.name = Fonte do item block.itemvoid.name = Item Void block.liquidsource.name = Liquid Source block.powervoid.name = Power Void @@ -582,19 +582,19 @@ block.phase-conveyor.name = Esteira de Fases block.bridge-conveyor.name = Esteira-Ponte block.plastanium-compressor.name = Compressor de Plastanio block.pyratite-mixer.name = Misturador de Piratita -block.blast-mixer.name = Blast Mixer +block.blast-mixer.name = Misturador de Explosão block.solidifer.name = Solidificador block.solar-panel.name = Painel Solar block.solar-panel-large.name = Painel Solar Grande block.oil-extractor.name = Extrator de Oleo -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.titan-factory.name = Titan Mech Factory -block.fortress-factory.name = Fortress Mech Factory -block.revenant-factory.name = Revenant Fighter Factory +block.spirit-factory.name = Fabrica de Drone Spirit +block.phantom-factory.name = Fabrica de Drone Phantom +block.wraith-factory.name = Fabrica de Drone Wraith +block.ghoul-factory.name = Fabrica de Bombardeiro Ghoul +block.dagger-factory.name = Fabrica de meca Dagger +block.titan-factory.name = Fabrica de meca titan +block.fortress-factory.name = Fabrica de meca Fortress +block.revenant-factory.name = Fabrica de lutadores Revenant block.repair-point.name = Ponto de Reparo block.pulse-conduit.name = Conduto de Pulso block.phase-conduit.name = Conduto de Fase @@ -603,178 +603,178 @@ block.liquid-tank.name = Tanque de Líquido block.liquid-junction.name = Junção de Líquido block.bridge-conduit.name = Conduto-Ponte block.rotary-pump.name = Bomba Rotatoria -block.thorium-reactor.name = Thorium Reactor +block.thorium-reactor.name = Reator Torio block.command-center.name = Centro De Comando -block.mass-driver.name = Mass Driver -block.blast-drill.name = Blast Drill -block.thermal-pump.name = Thermal Pump +block.mass-driver.name = Drive de Massa +block.blast-drill.name = Mineradora de Explosão +block.thermal-pump.name = Cano termico block.thermal-generator.name = Gerador Térmico -block.alloy-smelter.name = Alloy Smtler -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.alloy-smelter.name = Fundidora de Liga +block.mend-projector.name = Projetor Mend +block.surge-wall.name = Parede de Surge +block.surge-wall-large.name = Parede de surge grande +block.cyclone.name = Ciclone +block.fuse.name = Fundir +block.shock-mine.name = Mina de Choque +block.overdrive-projector.name = Projetor Overdrive +block.force-projector.name = Projetor Force block.arc.name = Arc -block.rtg-generator.name = RTG Generator -block.spectre.name = Spectre -block.meltdown.name = Meltdown +block.rtg-generator.name = Gerador RTG +block.spectre.name = Espectra +block.meltdown.name = Derreter block.container.name = Container -block.core.description = The most important building in the game. -team.blue.name = blue -team.red.name = red -team.orange.name = orange -team.none.name = gray -team.green.name = green -team.purple.name = purple -unit.alpha-drone.name = Alpha Drone -unit.spirit.name = Spirit Drone -unit.spirit.description = The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks. -unit.phantom.name = Phantom Drone -unit.phantom.description = An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone. +block.core.description = A mais importante construção do jogo. +team.blue.name = Azul +team.red.name = Vermelho +team.orange.name = Laranja +team.none.name = Cinza +team.green.name = Verde +team.purple.name = Roxo +unit.alpha-drone.name = Drone alfa +unit.spirit.name = Drone Spirit +unit.spirit.description = A unidade de drone inicial. Ele nasce no core por padrão. Minera minérios automaticamente, Coleta itens e repara blocos. +unit.phantom.name = Drone Phantom +unit.phantom.description = Uma unidade de drone avançada. Minera minérios automaticamente, Coleta itens e repara blocos automaticamente. Significantemente mais efetiva. unit.dagger.name = Dagger -unit.dagger.description = A basic ground unit. Useful in swarms. +unit.dagger.description = Unidade terrestre basica, Forte em grupos. unit.titan.name = Titan -unit.titan.description = An advanced armored ground unit. Uses carbide as ammo. Attacks both ground and air targets. -unit.ghoul.name = Ghoul Bomber -unit.ghoul.description = A heavy carpet bomber. Uses blast compound or pyratite as ammo. -unit.wraith.name = Wraith Fighter -unit.wraith.description = A fast, hit-and-run interceptor unit. -unit.fortress.name = Fortress -unit.fortress.description = A heavy artillery ground unit. +unit.titan.description = Uma unidade armadurada terreste avancada. Usa carbide como munição. Ataca ambas as unidades de Aereas e terrestres. +unit.ghoul.name = Bombardeiro Ghoul +unit.ghoul.description = Um bombardeiro pesado. Usa composto de explosão Ou piratite como munição. +unit.wraith.name = Lutador Wraith +unit.wraith.description = Uma unidade rapida, Interceptadora de bater e correr. +unit.fortress.name = Fortaleza +unit.fortress.description = Uma unidade pesada de artilharia terrestre. unit.revenant.name = Revenant -unit.revenant.description = A heavy laser platform. -tutorial.begin = Your mission here is to eradicate the[LIGHT_GRAY] enemy[].\n\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this. -tutorial.drill = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nPlace one on a copper vein. -tutorial.conveyor = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core. -tutorial.morecopper = More copper is required.\n\nEither mine it manually, or place more drills. -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.waves = The[LIGHT_GRAY] enemy[] approaches.\n\nDefend your core for 2 waves. Build more turrets. -tutorial.lead = More ores are available. Explore and mine[accent] lead[].\n\nDrag from your unit to the core to transfer resources. -tutorial.smelter = Copper and lead are weak metals.\nSuperior[accent] Dense Alloy[] can be created in a smelter.\n\nBuild one. -tutorial.densealloy = The smelter will now produce alloy.\nGet some.\nImprove the production if necessary. -tutorial.siliconsmelter = The core will now create a[accent] spirit drone[] for mining and repairing blocks.\n\nFactories for other units can be created with [accent] silicon.\nMake a silicon smelter. -tutorial.silicondrill = Silicon requires[accent] coal[] and[accent] sand[].\nStart by making drills. -tutorial.generator = This technology requires power.\nCreate a[accent] combustion generator[] for it. -tutorial.generatordrill = Combustion generators need fuel.\nFuel it with coal from a drill. -tutorial.node = Power requires transport.\nCreate a[accent] power node[] next to your combustion generator to transfer its power. -tutorial.nodelink = Power can be transferred through contacting power blocks and generators, or by linked power nodes.\n\nLink power by tapping the node and selecting the generator and silicon smelter. -tutorial.silicon = Silicon is being produced. Get some.\n\nImproving the production system is advised. -tutorial.daggerfactory = Construct a[accent] dagger mech factory.[]\n\nThis will be used to create attack mechs. -tutorial.router = Factories need resources to function.\nCreate a router to split conveyor resources. -tutorial.dagger = Link power nodes to the factory.\nOnce requirements are met, a mech will be created.\n\nCreate more drills, generators and conveyors as necessary. -tutorial.battle = The[LIGHT_GRAY] enemy[] has revealed their core.\nDestroy it with your unit and dagger mechs. -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.dense-alloy-wall.description = A standard defensive block.\nAdequate protection from enemies. -block.dense-alloy-wall-large.description = A standard defensive block.\nAdequate 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.mend-projector.description = Periodically heals buildings 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.duo.description = A small, cheap turret. -block.arc.description = A small turret which shoots electricity in a random arc towards the enemy. -block.hail.description = A small artillery turret. -block.lancer.description = A medium-sized turret which shoots charged electricity beams. -block.wave.description = A medium-sized rapid-fire turret which shoots liquid bubbles. -block.salvo.description = A medium-sized turret which fires shots in salvos. -block.swarmer.description = A medium-sized turret which shoots burst missiles. -block.ripple.description = A large artillery turret which fires several shots simultaneously. -block.cyclone.description = A large rapid fire turret. -block.fuse.description = A large turret which shoots powerful short-range beams. -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.conveyor.description = Basic item transport block. Moved 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.phase-conveyor.description = Advanced item transport block. Uses power to teleport items to a connected phase conveyor over several tiles. -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.mass-driver.description = Ultimate item transport block. Collects several items and then shoots them to another mass driver over a long range. -block.smelter.description = Burns coal for smelting copper and lead into dense alloy. -block.arc-smelter.description = Smelts copper and lead into dense alloy by using an external power source. -block.silicon-smelter.description = Reduces sand with highly pure coke in order to produce silicon. -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.pulverizer.description = Crushes stone into sand. Useful when there is a lack of natural sand. -block.pyratite-mixer.description = Mixes coal, lead and sand into highly flammable pyratite. -block.blast-mixer.description = Uses oil for transforming pyratite into the less flammable but more explosive blast compound. -block.cryofluidmixer.description = Combines water and titanium into cryofluid which is much more efficient for cooling. -block.solidifer.description = Cools lava to stone at a fast pace. -block.melter.description = Heats up stone to very high temperatures to obtain lava. -block.incinerator.description = Gets rid of any excess item or liquid. -block.biomattercompressor.description = Compresses biomatter in order to retrieve oil. -block.separator.description = Exposes stone to water pressure in order to obtain various minerals contained in the stone. -block.centrifuge.description = More efficient than the separator, but also more expensive to build and requires power. -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.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.turbine-generator.description = More efficient than a combustion generator, but requires additional water. -block.thermal-generator.description = Generates a large amount of power from lava. -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. -block.rtg-generator.description = A radioisotope thermoelectric generator which does not require cooling but provides less power than a thorium reactor. -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.container.description = Stores a small amount of items. Use it for creating buffers when there is a non-constant demand of materials. An[LIGHT_GRAY] unloader[] can be used to retrieve items from the container. -block.vault.description = Stores a large amount of items. Use it for creating buffers when there is a non-constant demand of materials. An[LIGHT_GRAY] unloader[] can be used to retrieve items from the vault. -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 the soil with water in order to obtain biomatter. -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.dart-ship-pad.description = Leave your current vessel and change into a basic fighter aircraft.\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.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.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. -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.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.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.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.dagger-factory.description = Produces basic ground units. -block.titan-factory.description = Produces advanced, armored ground units. -block.fortress-factory.description = Produces heavy artillery ground units. -block.revenant-factory.description = Produces heavy laser ground units. -block.repair-point.description = Continuously heals the closest damaged unit in its vicinity. -block.command-center.description = Allows changing friendly AI behavior. Currently, attack, retreat and patrol commands are supported. -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.phase-conduit.description = Advanced liquid transport block. Uses power to teleport liquids to a connected phase conduit over several tiles. -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 = Stores a large amount of liquids. 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 = Acts as a bridge for two crossing conduits. Useful in situations with two different conduits carrying different liquids to different locations. -block.bridge-conduit.description = Advanced liquid transport block. Allows transporting liquids over up to 3 tiles of any terrain or building. -block.mechanical-pump.description = A cheap pump with slow output, but no power consumption. -block.rotary-pump.description = An advanced pump which doubles up speed by using power. -block.thermal-pump.description = The ultimate pump. Three times as fast as a mechanical pump and the only pump which is able to retrieve lava. -block.router.description = Accepts items from one direction and outputs them to up to 3 other directions equally. Useful for splitting the materials from one source to multiple targets. -block.distributor.description = An advanced router which splits items to up to 7 other directions equally. -block.bridge-conveyor.description = Advanced item transport block. Allows transporting items over up to 3 tiles of any terrain or building. -block.alpha-mech-pad.description = When given enough power, rebuilds your ship into the[accent] Alpha[] mech. -block.itemsource.description = Infinitely outputs items. Sandbox only. -block.liquidsource.description = Infinitely outputs liquids. Sandbox only. -block.itemvoid.description = Destroys any items which go into it without using power. Sandbox only. -block.powerinfinite.description = Infinitely outputs power. Sandbox only. -block.powervoid.description = Voids all power inputted into it. Sandbox only. -liquid.water.description = Commonly used for cooling machines and waste processing. -liquid.lava.description = Can be transformed into[LIGHT_GRAY] stone[], used for generating power or used as ammo for certain turrets. -liquid.oil.description = Can be burnt, exploded or used as a coolant. -liquid.cryofluid.description = The most efficient liquid for cooling things down. +unit.revenant.description = Uma plataforma de laser pesada. +tutorial.begin = Sua missão aqui é de erradicar[LIGHT_GRAY] Inimigo[].\n\nComeçe por[accent] Minerar cobre[]. Clique numa veia de cobre perto de seu core para fazer isso. +tutorial.drill = Minerar manualmente é ineficiente.\n[accent]Mineradoras []podem minerar automaticamente.\nColoque uma numa veia de cobre. +tutorial.conveyor = [accent]Esteiras[] São usadas para transportar itens até o core.\nFaça uma linha de Esteiras da mineradora até o core. +tutorial.morecopper = Mais cobre é preciso.\n\nTanto minere manualmente, Ou coloque mais mineradoras. +tutorial.turret = Estruturas defensivas devem ser construidas para repelir[LIGHT_GRAY] O inimigo[].\nConstrua uma torre dupla perto de sua base. +tutorial.drillturret = Torres duplas precisam de[accent] Cobre como munição []Para atirar.\nColoque uma mineradoura Proxima a torre Para carregar ela com cobre minerado. +tutorial.waves = O[LIGHT_GRAY] Inimigo[] se aproxima.\n\nDefenda seu core por 2 ondas. Construa mais torres. +tutorial.lead = Mais minerios estão disponiveis. Explore e minere[accent] Cobre[].\n\nArraste Da sua unidade até o core para transferir recursos. +tutorial.smelter = Cobre e chumbo são materiais fracos.\nLiga densa[accent] Superior[] Pode ser feito num fundidor.\n\nConstrua um. +tutorial.densealloy = O fundidor agora vai fazer a liga.\nPegue.\nMelhore a produção se necessario. +tutorial.siliconsmelter = O core agora vai criar[accent] O drone Spirit[] Para minerar e consertar blocos.\n\nFabricas para outras unidades podem ser criadas usando [accent] silicio.\nFaça um fundidor de Silicio. +tutorial.silicondrill = Silicio requer[accent] carvão[] e[accent] areia[].\nComeçe a fazer mineradouras. +tutorial.generator = Essa tecnologia requer energia.\nCrie[accent] um gerador a combustão[] para isso. +tutorial.generatordrill = Gerador de combustão requer combustivel.\nCarregue com carvão minerado. +tutorial.node = Energia requer transporte.\nCrie um[accent] Nodo de energia[] Proximo do gerador de combustão. +tutorial.nodelink = Poder pode ser transportado construindo blocos de energia e geradores, Apenas construindo nodos de Energia.\n\nLigue a energia clicando no nodo e selecionando o gerador e o fundidor de silicio. +tutorial.silicon = Silicio esta sendo feito. Pegue.\n\nMelhorar a produção é recomendado. +tutorial.daggerfactory = Construa uma[accent] Fabrica do meca Dagger.[]\n\nIsso vai ser feito para construi mecas de ataque. +tutorial.router = Fabricas precisam de recursos pra construir\nCrie um roteador para espalhadar recursos da esteira. +tutorial.dagger = Ligue os nodos de energia a fabrica.\nQuando os requerimentos forem alcançados, Um meca vai ser criado.\n\nCrie mais mineradoras, geradoras e esteiras se necessario. +tutorial.battle = O[LIGHT_GRAY] Inimigo[] revelou seu core.\nDestrua com sua unidade e Dagger's. +block.copper-wall.description = Um bloco defensivo e barato.\nUtil para proteger o core e torres no começo. +block.copper-wall-large.description = Um bloco defensivo e barato.\nUtil para proteger o core e torres no começo.\nOcupa multiplos espaços. +block.dense-alloy-wall.description = Um bloco defensivo padrão.\nProteção adequada contra inimigos. +block.dense-alloy-wall-large.description = Um bloco defensivo padrão.\nProteção adequada contra inimigos.\nOcupa multiplos espaços. +block.thorium-wall.description = A strong defensive block.\nBoa proteção contra inimigos. +block.thorium-wall-large.description = Um bloco grande e defensivo.\nBoa proteção contra inimigos.\nOcupa multiplos espaços. +block.phase-wall.description = Não tão forte quanto a parede de torio Mas vai defletir balas a menos que seja muito forte. +block.phase-wall-large.description = Não tão forte quanto a parde de torio mas vai defletir balas a menos que seja muito forte.\nOcupa multiplos espaços. +block.surge-wall.description = O bloco defensivo mais forte.\nQue tem uma pequena chance de lancar um raio Contra o atacante. +block.surge-wall-large.description = O bloco defensivo mais forte.\nQue tem uma pequena chance de lancar um raio Contra o atacante.\nOcupa multiplos espaços +block.door.description = Uma pequena porta que pode ser aberta o fechada quando voce clica.\nSe aberta, Os inimigos podem atirar e passar. +block.door-large.description = Uma grande porta que pode ser aberta o fechada quando voce clica.\nSe aberta, Os inimigos podem atirar e passar..\nOcupa multiplos espaços. +block.mend-projector.description = Periodicamente conserta as construções. +block.overdrive-projector.description = Aumenta a velocidade de unidades proximas de geradores e esteiras. +block.force-projector.description = Cria um campo de forca hexagonal em volta de si mesmo, Protegendo construções e unidades dentro de dano por balas. +block.shock-mine.description = Danifica inimigos em cima da mina. Quase invisivel ao inimigo. +block.duo.description = Uma torre pequena e barata. +block.arc.description = Uma pequena torre que atira eletricidade em um pequeno arc aleatoriamente no inimigo. +block.hail.description = Uma pequena torre de artilharia. +block.lancer.description = Uma torre de Tamanho-Medio que atira raios de eletricidade. +block.wave.description = Uma torre que Tamanho medio que atira bolhas. +block.salvo.description = Uma torre media que da tiros em salvos. +block.swarmer.description = Uma torre media que atira ondas de misseis. +block.ripple.description = Uma grande torre que atira simultaneamente. +block.cyclone.description = Uma grande torre de tiro rapido. +block.fuse.description = Uma torre grande que atira raios de curta distancia poderosos. +block.spectre.description = Uma grande torre que da dois tiros poderosos ao mesmo tempo. +block.meltdown.description = Uma grande torre que atira dois raios poderosos ao mesmo tempo. +block.conveyor.description = Bloco de transporte de item basico. Move os itens a frente e os deposita automaticamente Em torres ou construtores. Rotacionavel. +block.titanium-conveyor.description = Bloco de transporte de item avancado. Move itens mais rapidos que esteiras padrões. +block.phase-conveyor.description = Bloco de transporte de item avançado. Usa energia para teleportar itens a uma esteira de fase sobre uma severa distancia. +block.junction.description = Funciona como uma ponte Para duas esteiras que estejam se cruzando. Util em situações que tenha duas esteiras diferentes carregando materiais diferentes para lugares diferentes. +block.mass-driver.description = Bloco de transporte de itens supremo. Coleta itens severos e atira eles em outro mass driver de uma longa distancia. +block.smelter.description = Queima carvão para derreter cobre e chumbo em liga densa. +block.arc-smelter.description = Derrete Cobre e chumbo em liga densa usando energia exterior. +block.silicon-smelter.description = Reduz areia a coque altamente puro Para fazer silicio. +block.plastanium-compressor.description = Produz plastanio para usando oleo e titanio. +block.phase-weaver.description = Produz tecido de fase de torio radioativo e grandes quantidades de areia. +block.alloy-smelter.description = Produz liga de surge de titanio, chumbo, silicio e cobre. +block.pulverizer.description = Esmaga pedra em areia. Util quando esta em falta de areia natural. +block.pyratite-mixer.description = Mistura carvão, Cobre e areia em piratite altamente inflamavel +block.blast-mixer.description = Usa oleo em Transformar piratite em composto de explosão menos inflamavel mas mais explosivo +block.cryofluidmixer.description = Combina agua e titanio em cryo fluido que é mais eficiente em esfriar. +block.solidifer.description = Esfria lava em pedra em um ritmo rapido. +block.melter.description = Aquece pedra em altas temperaturas para fazer lava. +block.incinerator.description = Se livra de itens em excesso ou liquidos. +block.biomattercompressor.description = Compressa Biomassa para recuperar oleo. +block.separator.description = Expos pedra em agua em pressão para ter varios mineiras contendo na pedra. +block.centrifuge.description = Mais eficiente que o separador, Mas mais caro e precisa de energia. +block.power-node.description = Transmite poder em nodos. Maximo de 4 fontes de energia, sinks ou nodos podem ser conectados. Os nodos vão receber energia de ou dar energia para qualquer bloco adjacente. +block.power-node-large.description = Tem um raio maior que o nodo de energia e pode conectar até 6 fontes de energia, sinks ou nodos. +block.battery.description = Guarda energia sempre que tiver em abundancia e da energia sempre que precisar enquanto tiver capacidade. +block.battery-large.description = Guarda muito mais energia que uma beteria comum +block.combustion-generator.description = Gera poder usando combustivel ou oleo. +block.turbine-generator.description = Mais eficiente que o gerador de Combustão, Mas requer agua adicional. +block.thermal-generator.description = Gera uma quantidade grande de energia usando lava. +block.solar-panel.description = Gera pequenas quantidades de energia do sol. +block.solar-panel-large.description = Da muito mais energia que o painel solar comum, Mas sua produção é mais cara. +block.thorium-reactor.description = Gera altas quantidades de energia do torio radioativo. Requer resfriamento constante. Vai explodir violentamente Se resfriamento insuficiente for fornecido. +block.rtg-generator.description = Um Gerador termoelétrico de radioisótopos Que não precisa de refriamento Mas da muito mais energia que o reator de torio. +block.unloader.description = Descarrega itens de um container, Descarrega em uma esteira ou diretamente em um bloco adjacente. O tipo de item que pode ser descarregado pode ser mudado clicando no descarregador. +block.container.description = Carrega uma baixa quantidade de itens. Usado para criar fontes Quando não tem uma necessidade constante de materiais. Um[LIGHT_GRAY] Descarregador[] pode ser usado para recuperar esses itens do container. +block.vault.description = Carrega uma alta quantidade de itens. Usado para criar fontes Quando não tem uma necessidade constante de materiais. Um[LIGHT_GRAY] Descarregador[] pode ser usado para recuperar esses itens do container. +block.mechanical-drill.description = Uma mineradoura barata. Quando colocado em blocos apropriados, retira itens em um ritmo lento e indefinitavamente. +block.pneumatic-drill.description = Uma mineradora improvisada que é mais rapida e capaz de processar mateirais mais duros usando a pressao do ar +block.laser-drill.description = Possibilita a mineração ainda mais rapida usando tecnologia a laser, Mas requer poder adcionalmente torio radioativo pode ser recuperado com essa mineradora +block.blast-drill.description = A melhor mineradora. Requer muita energia. +block.water-extractor.description = Extrai agua do chão. Use quando não tive nenhum lago proximo +block.cultivator.description = Cultiva o solo com agua para pegar bio materia. +block.oil-extractor.description = Usa altas quantidades de energia Para extrair oleo da areia. Use quando não tiver fontes de oleo por perto +block.dart-ship-pad.description = Deixe sua atual embarcação e mude para uma aeronave lutadora basica.\nUse o pad clicando duas vezes em cima enquando fica em cima dele. +block.trident-ship-pad.description = Deixe sua atual embarcação e mude para um bombardeiro resionavelmente bem armadurado.\nUse o pad clicando duas vezes em cima enquando fica em cima dele. +block.javelin-ship-pad.description = Deixe sua atual embarcação e mude para um interceptador forte e rapido com armas de raio.\nUse o pad clicando duas vezes em cima enquando fica em cima dele. +block.glaive-ship-pad.description = Deixe sua atual embarcação e mude para grande, bem armadurada nave de combate.\nUse o pad clicando duas vezes em cima enquando fica em cima dele. +block.tau-mech-pad.description = Deixe sua atual embarcação e mude para o meca de suporte que pode consertar construções aliadas e unidades.\nUse o pad clicando duas vezes em cima enquando fica em cima dele. +block.delta-mech-pad.description = Deixe sua atual embarcação e mude para o rapido, Levemente armadurado meca feito para ataques rapidos.\nUse o pad clicando duas vezes em cima enquando fica em cima dele. +block.omega-mech-pad.description = Deixe sua atual embarcação e mude para o volumoso e bem armadurado meca feito para ataques da primeira linha.\nUse o pad clicando duas vezes em cima enquando fica em cima dele. +block.spirit-factory.description = Produz drones leves que mineram e reparam blocos. +block.phantom-factory.description = Produz unidades de drone avancadas Que são significativamente mais efetivos que um drone spirit. +block.wraith-factory.description = produz unidades interceptor de ataque rapido. +block.ghoul-factory.description = Produz bombardeiros pesados. +block.dagger-factory.description = Produz unidades terrestres. +block.titan-factory.description = Produz unidades avancadas, armaduradas e terrestres. +block.fortress-factory.description = Produz unidades terrestres pesadas de artilharia. +block.revenant-factory.description = Produz unidades laser, pesadas e terrestres. +block.repair-point.description = Continuamente repara a unidade danificada mais proxima. +block.command-center.description = Permite mudar o comportamento IA dos aliados. Atualmente, atacar, recuar e patrulha são suportados. +block.conduit.description = Bloco de transporte de liquido basico. Funciona como a esteira, Mas com liquidos. Melhor usado com extratores, Bombas ou condutos. +block.pulse-conduit.description = Bloco avancado de transporte de liquido. Transporta liquidos mais rapido E armazena mais que os condutos padrões. +block.phase-conduit.description = Bloco avancado de transporte de liquido. Usa energia para teleportar liquidos conduto de fase sobre uma distancia severa. +block.liquid-router.description = Aceita liquidos de uma direcão e os joga em 3 direções igualmente. Pode armazenar uma certa quantidade de liquido. Util para espalhar liquidosd a fonte para multiplos alvos. +block.liquid-tank.description = Armazena grandes quantidades de liquido. Use quando a demanda de materiais não for constante ou para guardar itens para resfriar blocos vitais. +block.liquid-junction.description = Age como uma ponte para dois canos que se cruzam. Util em situações que tem dois condutos carregando liquidos diferentes até localizações diferentes. +block.bridge-conduit.description = Bloco de transporte de liquidos avancados. Possibilita o transporte de liquido sobre 3 blocos acima de construções ou paredes +block.mechanical-pump.description = Uma bomba barata mais saida de liquidos lenta, Sem consumo de energia. +block.rotary-pump.description = Uma bomba avancada que duplica a velocidade da saida de liquida usando energia. +block.thermal-pump.description = A melhor bomba. Trez vezes mais rapida que a bomba mecanica e a unica bomba capaz de pegar lava. +block.router.description = Aceita itens de uma direção e os divide em 3 direções igualmente. Util para espalhar materiais da fonte para multiplos alvos. +block.distributor.description = Um roteador avancada que espalhas os itens em 7 outras direções igualmente. +block.bridge-conveyor.description = Bloco de transporte de itens avancado. Possibilita o transporte de itens acima de 3 blocos de construção ou paredes. +block.alpha-mech-pad.description = Quando dado energia o suficiente, Reconstrua sua nave em [accent] Alpha[] mech. +block.itemsource.description = Infinivamente da itens. Apenas caixa de areia. +block.liquidsource.description = Infinitivamente da Liquidos. Apenas caixa de areia. +block.itemvoid.description = Destroi qualquer item que entre sem requerir energia. Apenas caixa de areia. +block.powerinfinite.description = Infinitivamente da energia. Apenas caixa de areia. +block.powervoid.description = Destroi qualquer energia que entre dentro. Apenas caixa de areia. +liquid.water.description = Comumente usado em resfriamento e no processo de perda. +liquid.lava.description = Pode ser transformado em[LIGHT_GRAY] pedra[], usado para gerar energia ou usado como munição para certas torres. +liquid.oil.description = Pode ser queimado, explodido ou usado como resfriador. +liquid.cryofluid.description = A maneira mais eficiente de resfriar qualquer coisa. diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 4d5e3040c6..fa1d1c3e04 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -1,4 +1,4 @@ -text.credits.text = Создатель [ROYAL] Anuken. - [SKY]anukendev@gmail.com[][]\n\nЕсть недороботки в переводе?\nПишите в офф. discord-сервер mindustry в канал #русский.\n\nПереводчики на русский язык:\n[YELLOW]Prosta4ok_ua\n[GREEN]xga\n[BLACK]XZimur +text.credits.text = Создатель [ROYAL] Anuken. - [SKY]anukendev@gmail.com[][]\n\nЕсть недоработки в переводе?\nПишите в офф. discord-сервер mindustry в канал #русский.\n\nПереводчики на русский язык:\n[YELLOW]Prosta4ok_ua\n[GREEN]xga\n[BLACK]XZimur text.credits = Авторы text.contributors = Переводчики и контрибьюторы text.discord = Присоединяйтесь к нашему Discord! @@ -12,7 +12,7 @@ text.link.wiki.description = Официальная вики Mindustry(англ. text.linkfail = Не удалось открыть ссылку!\nURL-адрес был скопирован в буфер обмена. text.gameover = Игра окончена text.gameover.pvp = [accent] {0}[] команда победила! -text.sector.gameover = Этот сектор потерян. Высадится повторно? +text.sector.gameover = Этот сектор потерян. Высадиться повторно? text.sector.retry = Повторить попытку text.highscore = [YELLOW]Новый рекорд! text.wave.lasted = Вы продержались до [accent]{0}[]-ой волны. @@ -49,9 +49,9 @@ text.mission.main = Главная мисия:[LIGHT_GRAY] {0} text.mission.info = Информация о миссии text.mission.complete = Миссия выполнена! text.mission.complete.body = Сектор {0},{1} был завоёван. -text.mission.wave = Осталось[accent] {0}[] волн из[accent] {1}[]\nВолна через {2} -text.mission.wave.enemies = Осталось[accent] {0}/{1}[] волн:\n{2} враг. -text.mission.wave.enemy = Осталось[accent] {0}/{1}[] волн\n{2} враг +text.mission.wave = Волна[accent] {0}[] из[accent] {1}[]\nВолна через {2} +text.mission.wave.enemies = Волна[accent] {0} из {1}[]\n{2} враг. +text.mission.wave.enemy = Волна[accent] {0} из {1}[]\n{2} враг text.mission.wave.menu = Пережить[accent] {0} []волн text.mission.battle = Уничтожьте ядро противника. text.mission.resource.menu = Добыть {0} х{1} @@ -266,7 +266,7 @@ text.error.invalidaddress = Некорректный адрес. text.error.timedout = Время ожидания истекло!\nУбедитесь, что хост настроен для перенаправления портов и адрес корректный! text.error.mismatch = Ошибка пакета:\nвозможное несоответствие версии клиента/сервера. \nУбедитесь, что у Вас и у владельца сервера установлена последняя версия Mindustry! text.error.alreadyconnected = Вы уже подключены. -text.error.mapnotfound = Map file not found! +text.error.mapnotfound = Не найден файл карты! text.error.any = Неизвестная сетевая ошибка. text.settings.language = Язык text.settings.reset = Сбросить по умолчанию @@ -345,7 +345,7 @@ text.category.power = Энергия text.category.liquids = Жидкости text.category.items = Предметы text.category.crafting = Создание -text.category.shooting = Cтрельба +text.category.shooting = Стрельба text.category.optional = Дополнительные улучшения setting.autotarget.name = Авто-цель setting.fpscap.name = Макс. FPS @@ -407,8 +407,8 @@ mode.waves.name = Волны mode.waves.description = Обычный режим. В режиме "Волны" надо самим добывать ресурсы и сами волны идут безостановочно. mode.sandbox.name = Песочница mode.sandbox.description = Бесконечные ресурсы и нет таймера для волн, но можно самим вызвать волну. -mode.freebuild.name = Cвободная\nстрой -mode.freebuild.description = ограниченные ресурсы и нет таймера для волн. +mode.freebuild.name = Свободная\nстройка +mode.freebuild.description = Ограниченные ресурсы и нет таймера для волн. mode.pvp.name = Противо-\nстояние mode.pvp.description = боритесь против других игроков. content.item.name = Предметы @@ -435,7 +435,7 @@ item.silicon.description = Очень полезный полупроводни item.plastanium.name = Пластиний item.plastanium.description = Легкий, пластичный материал, используемый в современных самолетах и боеприпасах для фрагментации. item.phase-fabric.name = Фазовая ткань -item.phase-fabric.description = Невесомое вещество, используемое в современной электронике и технологии самовосстановления. +item.phase-fabric.description = Невесомое вещество, используемое в современной электронике и технологии самовосстановления. Непригодна для вышивания. item.surge-alloy.name = Высокопрочный сплав item.surge-alloy.description = Передовой сплав с уникальными электрическими свойствами. item.biomatter.name = Биоматерия @@ -461,7 +461,7 @@ mech.delta-mech.description = Быстрый, легкобронированны mech.tau-mech.name = Тау mech.tau-mech.weapon = Восстановительный лазер mech.tau-mech.ability = Регенирирующая вспышка -mech.tau-mech.description = Мех поддержки. Исцеляет союзные блоки, стреляя в них. Может исцелить союзников радиусом с его способностью восстанавления. +mech.tau-mech.description = Мех поддержки. Чинит союзные блоки, стреляя в них. Может исцелить союзников радиусом с его способностью восстанавления. mech.omega-mech.name = Омега mech.omega-mech.weapon = Ракетомётный пулемётконфигурация mech.omega-mech.ability = Защитная @@ -498,7 +498,7 @@ block.constructing = {0}[LIGHT_GRAY](В процессе) block.spawn.name = Точка появления врагов block.core.name = Ядро block.space.name = Пустота -block.metalfloor.name = Мeталичeский пoл +block.metalfloor.name = Металлическая плита block.deepwater.name = Глубоководье block.water.name = Вода block.lava.name = Лава @@ -731,8 +731,8 @@ block.solar-panel-large.description = Зелёная энергия. Больш block.thorium-reactor.description = Производит энергию в большом количестве. Может взорваться. Требуется торий и жидкость для охлаждения (вода или криогенная). block.rtg-generator.description = Радиоизотопный термоэлектрический генератор, который не требует охлаждения, но обеспечивает меньшую мощность, чем ториевый реактор. block.unloader.description = Выгружает из ядра или хранилища верхний левый предмет. -block.container.description = Хранит небольшое количество предметов(250). Используйте его для создания буферов, когда существует непостоянная потребность в материалах. [LIGHT_GRAY] Разгрузчик[] можно использовать для извлечения элементов из хранилища. -block.vault.description = Хранит большое количество предметов(1000). Используйте его для создания буферов, когда существует непостоянная потребность в материалах.[LIGHT_GRAY] Разгрузчик[] можно использовать для извлечения элементов из хранилища. +block.container.description = Хранит небольшое количество предметов(200). Используйте его для создания буферов, когда существует непостоянная потребность в материалах. [LIGHT_GRAY] Разгрузчик[] можно использовать для извлечения элементов из хранилища. +block.vault.description = Хранит большое количество предметов(900). Используйте его для создания буферов, когда существует непостоянная потребность в материалах.[LIGHT_GRAY] Разгрузчик[] можно использовать для извлечения элементов из хранилища. block.mechanical-drill.description = Самый первый доступный бур. \n\nДобывает медь, свинец, уголь, песок. \n\nМожно подвести к нему [BLUE] воду[] для увеличения скорости сверления. block.pneumatic-drill.description = Улучшенная версия механического бура.\n\nДобывает тоже самое, что и механический бур. Также может добывать титан и камень.\n\nМожно подвести к нему[BLUE] воду[] для увеличения скорости сверления. block.laser-drill.description = Улучшенная версия пневматического бура.\n\nДобывает тоже самое, что и пневматический бур. Также может добывать торий.\n\nМожно подвести к нему[BLUE] воду[] для увеличения скорости сверления. diff --git a/core/assets/sprites/sprites.atlas b/core/assets/sprites/sprites.atlas index d0c0e306ca..9a52df3e11 100644 --- a/core/assets/sprites/sprites.atlas +++ b/core/assets/sprites/sprites.atlas @@ -6,1232 +6,1232 @@ filter: Nearest,Nearest repeat: none force-projector-top rotate: false - xy: 314, 349 + xy: 392, 312 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 mend-projector-top rotate: false - xy: 405, 260 + xy: 530, 378 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 overdrive-projector-top rotate: false - xy: 405, 242 + xy: 512, 342 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 bridge-conveyor-bridge rotate: false - xy: 97, 75 + xy: 84, 108 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 bridge-conveyor-end rotate: false - xy: 107, 75 + xy: 124, 138 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-0-1 rotate: false - xy: 403, 143 + xy: 124, 98 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-0-2 rotate: false - xy: 732, 304 + xy: 174, 138 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-0-3 rotate: false - xy: 732, 294 + xy: 164, 128 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-1-0 rotate: false - xy: 612, 220 + xy: 154, 118 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-1-1 rotate: false - xy: 622, 220 + xy: 144, 108 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-1-2 rotate: false - xy: 632, 220 + xy: 134, 98 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-1-3 rotate: false - xy: 284, 304 + xy: 184, 138 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-2-0 rotate: false - xy: 428, 179 + xy: 174, 128 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-2-1 rotate: false - xy: 736, 434 + xy: 164, 118 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-2-2 rotate: false - xy: 736, 424 + xy: 154, 108 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-2-3 rotate: false - xy: 736, 414 + xy: 144, 98 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-3-0 rotate: false - xy: 736, 404 + xy: 184, 128 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-3-1 rotate: false - xy: 736, 394 + xy: 174, 118 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-3-2 rotate: false - xy: 736, 384 + xy: 164, 108 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-3-3 rotate: false - xy: 746, 428 + xy: 154, 98 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-4-0 rotate: false - xy: 746, 418 + xy: 184, 118 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-4-1 rotate: false - xy: 746, 408 + xy: 174, 108 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-4-2 rotate: false - xy: 746, 398 + xy: 164, 98 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-4-3 rotate: false - xy: 746, 388 + xy: 184, 108 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-0-1 rotate: false - xy: 754, 329 + xy: 93, 39 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-0-2 rotate: false - xy: 754, 319 + xy: 103, 38 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-0-3 rotate: false - xy: 742, 308 + xy: 113, 38 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-1-0 rotate: false - xy: 742, 298 + xy: 123, 38 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-1-1 rotate: false - xy: 768, 333 + xy: 133, 38 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-1-2 rotate: false - xy: 778, 333 + xy: 143, 38 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-1-3 rotate: false - xy: 788, 333 + xy: 153, 38 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-2-0 rotate: false - xy: 798, 333 + xy: 163, 38 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-2-1 rotate: false - xy: 808, 333 + xy: 173, 38 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-2-2 rotate: false - xy: 818, 333 + xy: 183, 38 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-2-3 rotate: false - xy: 828, 333 + xy: 91, 29 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-3-0 rotate: false - xy: 764, 323 + xy: 91, 19 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-3-1 rotate: false - xy: 774, 323 + xy: 91, 9 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-3-2 rotate: false - xy: 784, 323 + xy: 101, 28 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-3-3 rotate: false - xy: 794, 323 + xy: 101, 18 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-4-0 rotate: false - xy: 804, 323 + xy: 111, 28 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-4-1 rotate: false - xy: 814, 323 + xy: 111, 18 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-4-2 rotate: false - xy: 824, 323 + xy: 121, 28 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-4-3 rotate: false - xy: 742, 288 + xy: 121, 18 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 mass-driver-turret rotate: false - xy: 522, 348 + xy: 778, 427 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 phase-conveyor-arrow rotate: false - xy: 918, 357 + xy: 457, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 phase-conveyor-bridge rotate: false - xy: 928, 367 + xy: 467, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 phase-conveyor-end rotate: false - xy: 918, 347 + xy: 467, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 warp-gate rotate: false - xy: 626, 346 + xy: 934, 427 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 warp-gate-top rotate: false - xy: 652, 372 + xy: 960, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 blast-drill rotate: false - xy: 535, 418 + xy: 39, 17 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 blast-drill-rim rotate: false - xy: 39, 45 + xy: 622, 458 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 blast-drill-rotator rotate: false - xy: 561, 418 + xy: 648, 461 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 blast-drill-top rotate: false - xy: 39, 19 + xy: 288, 372 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 laser-drill rotate: false - xy: 369, 260 + xy: 531, 252 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 laser-drill-rotator rotate: false - xy: 369, 242 + xy: 512, 396 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 laser-drill-top rotate: false - xy: 376, 278 + xy: 512, 378 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 mechanical-drill rotate: false - xy: 387, 260 + xy: 530, 396 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 mechanical-drill-rotator rotate: false - xy: 387, 242 + xy: 512, 360 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 mechanical-drill-top rotate: false - xy: 394, 278 + xy: 548, 396 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 oil-extractor rotate: false - xy: 548, 392 + xy: 804, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 oil-extractor-liquid rotate: false - xy: 548, 366 + xy: 804, 427 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 oil-extractor-rotator rotate: false - xy: 574, 392 + xy: 830, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 oil-extractor-top rotate: false - xy: 574, 366 + xy: 830, 427 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 plasma-drill rotate: false - xy: 337, 450 + xy: 269, 398 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plasma-drill-rim rotate: false - xy: 337, 416 + xy: 303, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plasma-drill-rotator rotate: false - xy: 371, 450 + xy: 303, 401 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plasma-drill-top rotate: false - xy: 371, 416 + xy: 254, 364 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pneumatic-drill rotate: false - xy: 448, 278 + xy: 566, 378 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 pneumatic-drill-rotator rotate: false - xy: 459, 260 + xy: 548, 360 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 pneumatic-drill-top rotate: false - xy: 459, 242 + xy: 602, 396 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 water-extractor rotate: false - xy: 567, 242 + xy: 554, 270 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 water-extractor-liquid rotate: false - xy: 574, 278 + xy: 549, 252 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 water-extractor-rotator rotate: false - xy: 585, 260 + xy: 584, 324 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 water-extractor-top rotate: false - xy: 585, 242 + xy: 582, 306 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 blackrock1 rotate: false - xy: 117, 166 + xy: 672, 353 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-blackrock rotate: false - xy: 117, 166 + xy: 672, 353 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blackrockshadow1 rotate: false - xy: 127, 166 + xy: 684, 365 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blackstone1 rotate: false - xy: 137, 166 + xy: 708, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-blackstone rotate: false - xy: 137, 166 + xy: 708, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blackstone2 rotate: false - xy: 147, 166 + xy: 672, 343 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blackstone3 rotate: false - xy: 157, 166 + xy: 1012, 437 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blackstoneedge rotate: false - xy: 472, 228 + xy: 288, 332 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 coal1 rotate: false - xy: 93, 65 + xy: 114, 128 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 coal2 rotate: false - xy: 93, 55 + xy: 104, 118 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 coal3 rotate: false - xy: 103, 65 + xy: 94, 108 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 copper1 rotate: false - xy: 756, 428 + xy: 174, 98 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 copper2 rotate: false - xy: 756, 418 + xy: 184, 98 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 copper3 rotate: false - xy: 766, 423 + xy: 84, 88 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dirt2 rotate: false - xy: 766, 383 + xy: 154, 88 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dirt3 rotate: false - xy: 746, 378 + xy: 164, 88 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dirtedge rotate: false - xy: 85, 176 + xy: 634, 278 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 generic-cliff-edge rotate: false - xy: 768, 363 + xy: 103, 78 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ice-cliff-edge rotate: false - xy: 768, 363 + xy: 103, 78 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 generic-cliff-edge-1 rotate: false - xy: 768, 353 + xy: 83, 48 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ice-cliff-edge-1 rotate: false - xy: 768, 353 + xy: 83, 48 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 generic-cliff-edge-2 rotate: false - xy: 758, 349 + xy: 93, 59 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ice-cliff-edge-2 rotate: false - xy: 758, 349 + xy: 93, 59 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 generic-cliff-side rotate: false - xy: 768, 343 + xy: 103, 68 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ice-cliff-side rotate: false - xy: 768, 343 + xy: 103, 68 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 grass-cliff-edge rotate: false - xy: 223, 148 + xy: 103, 58 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 grass-cliff-edge-1 rotate: false - xy: 233, 148 + xy: 113, 68 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 grass-cliff-edge-2 rotate: false - xy: 243, 148 + xy: 123, 78 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 grass-cliff-side rotate: false - xy: 253, 148 + xy: 113, 58 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 grass2 rotate: false - xy: 203, 148 + xy: 113, 78 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 grass3 rotate: false - xy: 213, 148 + xy: 93, 49 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 grassedge rotate: false - xy: 141, 176 + xy: 585, 256 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 ice2 rotate: false - xy: 273, 148 + xy: 133, 78 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ice3 rotate: false - xy: 283, 148 + xy: 123, 58 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 iceedge rotate: false - xy: 169, 176 + xy: 620, 264 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 icerock2 rotate: false - xy: 293, 148 + xy: 133, 68 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icerockshadow1 rotate: false - xy: 303, 148 + xy: 143, 78 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 rockshadow1 rotate: false - xy: 303, 148 + xy: 143, 78 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icerockshadow2 rotate: false - xy: 313, 148 + xy: 133, 58 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 rockshadow2 rotate: false - xy: 313, 148 + xy: 133, 58 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 lavaedge rotate: false - xy: 211, 180 + xy: 585, 242 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 lead1 rotate: false - xy: 806, 403 + xy: 183, 48 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 lead2 rotate: false - xy: 816, 413 + xy: 1004, 395 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 lead3 rotate: false - xy: 786, 373 + xy: 1004, 385 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor2 rotate: false - xy: 806, 383 + xy: 694, 365 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor3 rotate: false - xy: 816, 393 + xy: 708, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor4 rotate: false - xy: 826, 403 + xy: 740, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor5 rotate: false - xy: 778, 343 + xy: 682, 353 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor6 rotate: false - xy: 788, 353 + xy: 682, 343 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalflooredge rotate: false - xy: 267, 180 + xy: 641, 250 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 rock2 rotate: false - xy: 958, 347 + xy: 497, 222 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand2 rotate: false - xy: 978, 367 + xy: 517, 232 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand3 rotate: false - xy: 968, 347 + xy: 507, 222 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sandedge rotate: false - xy: 281, 180 + xy: 599, 236 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 shrubshadow rotate: false - xy: 1008, 347 + xy: 557, 232 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow2 rotate: false - xy: 838, 337 + xy: 547, 222 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow3 rotate: false - xy: 848, 337 + xy: 567, 242 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snowedge rotate: false - xy: 309, 180 + xy: 627, 236 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 spaceedge rotate: false - xy: 323, 180 + xy: 641, 236 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 stone-cliff-edge rotate: false - xy: 968, 337 + xy: 204, 122 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 stone-cliff-edge-1 rotate: false - xy: 978, 337 + xy: 204, 112 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 stone-cliff-edge-2 rotate: false - xy: 988, 337 + xy: 204, 102 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 stone-cliff-side rotate: false - xy: 998, 337 + xy: 204, 92 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 stone2 rotate: false - xy: 948, 337 + xy: 205, 142 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 stone3 rotate: false - xy: 958, 337 + xy: 204, 132 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 stoneedge rotate: false - xy: 351, 180 + xy: 655, 236 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 taredge rotate: false - xy: 69, 158 + xy: 998, 433 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 thorium1 rotate: false - xy: 734, 338 + xy: 203, 72 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 thorium2 rotate: false - xy: 734, 328 + xy: 193, 52 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 thorium3 rotate: false - xy: 744, 338 + xy: 203, 62 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium1 rotate: false - xy: 734, 318 + xy: 203, 52 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium2 rotate: false - xy: 744, 328 + xy: 193, 42 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium3 rotate: false - xy: 744, 318 + xy: 203, 42 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 water-cliff-edge rotate: false - xy: 633, 268 + xy: 131, 18 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 water-cliff-edge-1 rotate: false - xy: 633, 258 + xy: 141, 28 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 water-cliff-edge-2 rotate: false - xy: 633, 248 + xy: 141, 18 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 water-cliff-side rotate: false - xy: 638, 278 + xy: 151, 28 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 wateredge rotate: false - xy: 379, 180 + xy: 1000, 349 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 block-border rotate: false - xy: 82, 135 + xy: 672, 323 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-elevation rotate: false - xy: 92, 145 + xy: 662, 317 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 combustion-generator-top rotate: false - xy: 92, 145 + xy: 662, 317 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-middle rotate: false - xy: 81, 22 + xy: 104, 138 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pump-liquid rotate: false - xy: 81, 22 + xy: 104, 138 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-slope rotate: false - xy: 403, 163 + xy: 94, 128 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 border rotate: false - xy: 88, 85 + xy: 84, 118 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-liquid rotate: false - xy: 123, 45 + xy: 144, 128 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 cross-1 rotate: false - xy: 756, 408 + xy: 94, 88 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 cross-2 rotate: false - xy: 910, 443 + xy: 950, 361 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 cross-3 rotate: false - xy: 470, 364 + xy: 340, 312 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 cross-4 rotate: false - xy: 160, 276 + xy: 949, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 nuclearreactor-shadow rotate: false - xy: 507, 416 + xy: 499, 416 size: 26, 26 orig: 26, 26 offset: 0, 0 index: -1 place-arrow rotate: false - xy: 928, 357 + xy: 467, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ripples rotate: false - xy: 365, 168 + xy: 684, 387 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 rubble-1-0 rotate: false - xy: 477, 260 + xy: 528, 306 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 rubble-1-1 rotate: false - xy: 477, 242 + xy: 584, 378 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 rubble-2-0 rotate: false - xy: 484, 278 + xy: 548, 342 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 rubble-2-1 rotate: false - xy: 495, 260 + xy: 566, 360 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 rubble-3-0 rotate: false - xy: 522, 322 + xy: 882, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 rubble-3-1 rotate: false - xy: 522, 322 + xy: 882, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 shadow-1 rotate: false - xy: 377, 168 + xy: 684, 375 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 shadow-2 rotate: false - xy: 698, 388 + xy: 418, 316 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 shadow-3 rotate: false - xy: 720, 456 + xy: 39, 71 size: 26, 26 orig: 26, 26 offset: 0, 0 @@ -1259,322 +1259,322 @@ shadow-6 index: -1 shadow-corner rotate: false - xy: 274, 314 + xy: 672, 363 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 shadow-round-1 rotate: false - xy: 272, 302 + xy: 696, 387 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 shadow-round-2 rotate: false - xy: 678, 364 + xy: 438, 390 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 shadow-round-3 rotate: false - xy: 39, 71 + xy: 39, 43 size: 26, 26 orig: 26, 26 offset: 0, 0 index: -1 shadow-round-4 rotate: false - xy: 789, 477 + xy: 675, 477 size: 34, 34 orig: 34, 34 offset: 0, 0 index: -1 shadow-rounded-2 rotate: false - xy: 698, 368 + xy: 438, 370 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 shadow-shock-mine rotate: false - xy: 1008, 367 + xy: 537, 222 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 bridge-conduit-arrow rotate: false - xy: 98, 85 + xy: 114, 138 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 bridge-conveyor-arrow rotate: false - xy: 98, 85 + xy: 114, 138 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 bridge-conduit-bridge rotate: false - xy: 108, 85 + xy: 104, 128 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 bridge-conduit-end rotate: false - xy: 87, 75 + xy: 94, 118 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-bottom rotate: false - xy: 103, 35 + xy: 104, 108 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-bottom-0 rotate: false - xy: 113, 65 + xy: 94, 98 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-bottom-1 rotate: false - xy: 113, 55 + xy: 144, 138 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-bottom-2 rotate: false - xy: 113, 45 + xy: 134, 128 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-bottom-3 rotate: false - xy: 113, 35 + xy: 124, 118 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-bottom-4 rotate: false - xy: 117, 75 + xy: 114, 108 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-bottom-5 rotate: false - xy: 123, 65 + xy: 104, 98 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-bottom-6 rotate: false - xy: 123, 55 + xy: 154, 138 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-top-0 rotate: false - xy: 123, 35 + xy: 134, 118 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-top-1 rotate: false - xy: 403, 153 + xy: 124, 108 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-top-2 rotate: false - xy: 393, 150 + xy: 114, 98 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-top-3 rotate: false - xy: 93, 25 + xy: 164, 138 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-top-4 rotate: false - xy: 103, 25 + xy: 154, 128 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-top-5 rotate: false - xy: 113, 25 + xy: 144, 118 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-top-6 rotate: false - xy: 123, 25 + xy: 134, 108 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-router-bottom rotate: false - xy: 778, 353 + xy: 1014, 367 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-router-liquid rotate: false - xy: 796, 373 + xy: 1014, 357 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-router-top rotate: false - xy: 788, 363 + xy: 1014, 347 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-tank-bottom rotate: false - xy: 444, 338 + xy: 726, 401 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-tank-liquid rotate: false - xy: 470, 338 + xy: 752, 411 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-tank-top rotate: false - xy: 496, 338 + xy: 778, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 phase-conduit-arrow rotate: false - xy: 908, 357 + xy: 457, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 phase-conduit-bridge rotate: false - xy: 918, 367 + xy: 447, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 phase-conduit-end rotate: false - xy: 908, 347 + xy: 457, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulse-conduit-top-0 rotate: false - xy: 938, 367 + xy: 477, 242 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulse-conduit-top-1 rotate: false - xy: 928, 347 + xy: 477, 232 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulse-conduit-top-2 rotate: false - xy: 938, 357 + xy: 487, 242 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulse-conduit-top-3 rotate: false - xy: 948, 367 + xy: 487, 232 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulse-conduit-top-4 rotate: false - xy: 938, 347 + xy: 477, 222 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulse-conduit-top-5 rotate: false - xy: 948, 357 + xy: 497, 242 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulse-conduit-top-6 rotate: false - xy: 958, 367 + xy: 497, 232 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 alpha-mech-pad rotate: false - xy: 189, 258 + xy: 796, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-alpha-mech-pad rotate: false - xy: 189, 258 + xy: 796, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 battery rotate: false - xy: 107, 166 + xy: 302, 312 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-battery rotate: false - xy: 107, 166 + xy: 302, 312 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -1595,378 +1595,378 @@ block-icon-battery-large index: -1 fusion-reactor rotate: false - xy: 121, 242 + xy: 92, 276 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 fusion-reactor-bottom rotate: false - xy: 155, 242 + xy: 126, 276 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 fusion-reactor-light rotate: false - xy: 89, 208 + xy: 160, 276 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 fusion-reactor-plasma-0 rotate: false - xy: 123, 208 + xy: 87, 242 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 fusion-reactor-plasma-1 rotate: false - xy: 157, 208 + xy: 121, 242 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 fusion-reactor-plasma-2 rotate: false - xy: 269, 432 + xy: 155, 242 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 fusion-reactor-plasma-3 rotate: false - xy: 269, 398 + xy: 89, 208 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 fusion-reactor-top rotate: false - xy: 303, 435 + xy: 123, 208 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rtg-generator-top rotate: false - xy: 968, 357 + xy: 517, 242 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 thorium-reactor-center rotate: false - xy: 626, 398 + xy: 908, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 thorium-reactor-lights rotate: false - xy: 626, 372 + xy: 908, 427 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 turbine-generator-top rotate: false - xy: 549, 242 + xy: 554, 288 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 alloy-smelter rotate: false - xy: 39, 1 + xy: 438, 332 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-alloy-smelter rotate: false - xy: 39, 1 + xy: 438, 332 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 alloy-smelter-top rotate: false - xy: 57, 1 + xy: 778, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 arc-smelter rotate: false - xy: 214, 278 + xy: 814, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-arc-smelter rotate: false - xy: 214, 278 + xy: 814, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 arc-smelter-top rotate: false - xy: 232, 278 + xy: 832, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 silicon-smelter-top rotate: false - xy: 232, 278 + xy: 832, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 biomattercompressor rotate: false - xy: 626, 328 + xy: 850, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 biomattercompressor-frame0 rotate: false - xy: 644, 328 + xy: 438, 314 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 biomattercompressor-frame1 rotate: false - xy: 207, 258 + xy: 908, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 biomattercompressor-frame2 rotate: false - xy: 225, 260 + xy: 926, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 biomattercompressor-liquid rotate: false - xy: 243, 260 + xy: 944, 409 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 biomattercompressor-top rotate: false - xy: 250, 278 + xy: 962, 415 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 blast-mixer rotate: false - xy: 261, 260 + xy: 1006, 461 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-blast-mixer rotate: false - xy: 261, 260 + xy: 1006, 461 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 centrifuge-liquid rotate: false - xy: 910, 461 + xy: 968, 379 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 cryofluidmixer-bottom rotate: false - xy: 928, 461 + xy: 968, 361 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 cryofluidmixer-liquid rotate: false - xy: 910, 425 + xy: 986, 363 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 cryofluidmixer-top rotate: false - xy: 928, 443 + xy: 189, 258 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 cultivator rotate: false - xy: 946, 461 + xy: 207, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 cultivator-middle rotate: false - xy: 928, 425 + xy: 225, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 cultivator-top rotate: false - xy: 946, 443 + xy: 243, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 lavasmelter rotate: false - xy: 796, 393 + xy: 173, 48 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 oilrefinery rotate: false - xy: 788, 343 + xy: 682, 293 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 phase-weaver rotate: false - xy: 423, 242 + xy: 530, 360 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 phase-weaver-bottom rotate: false - xy: 430, 278 + xy: 548, 378 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 phase-weaver-weave rotate: false - xy: 441, 260 + xy: 584, 396 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 plastanium-compressor-top rotate: false - xy: 441, 242 + xy: 530, 342 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 pulverizer rotate: false - xy: 948, 347 + xy: 487, 222 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulverizer-rotator rotate: false - xy: 958, 357 + xy: 507, 242 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 separator-liquid rotate: false - xy: 998, 347 + xy: 547, 232 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 core-open rotate: false - xy: 418, 364 + xy: 392, 338 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 core-top rotate: false - xy: 444, 364 + xy: 314, 323 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 sortedunloader rotate: false - xy: 898, 337 + xy: 194, 132 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-1 rotate: false - xy: 93, 155 + xy: 752, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-1-top rotate: false - xy: 82, 145 + xy: 662, 327 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-2 rotate: false - xy: 672, 346 + xy: 458, 392 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-2-top rotate: false - xy: 690, 346 + xy: 458, 374 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-3 rotate: false - xy: 288, 372 + xy: 314, 375 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-3-top rotate: false - xy: 314, 375 + xy: 674, 451 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-4 rotate: false - xy: 825, 479 + xy: 711, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-4-top rotate: false - xy: 859, 479 + xy: 745, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1980,343 +1980,343 @@ arc index: -1 arc-heat rotate: false - xy: 256, 296 + xy: 256, 312 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 cyclone rotate: false - xy: 496, 364 + xy: 366, 312 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 duo rotate: false - xy: 748, 358 + xy: 83, 58 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 fuse rotate: false - xy: 392, 338 + xy: 726, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 hail rotate: false - xy: 263, 148 + xy: 123, 68 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 hail-heat rotate: false - xy: 735, 444 + xy: 242, 339 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 lancer rotate: false - xy: 351, 242 + xy: 495, 252 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 lancer-heat rotate: false - xy: 358, 278 + xy: 513, 252 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 meltdown rotate: false - xy: 303, 401 + xy: 157, 208 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 meltdown-heat rotate: false - xy: 254, 364 + xy: 269, 432 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ripple rotate: false - xy: 548, 340 + xy: 856, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ripple-heat rotate: false - xy: 574, 340 + xy: 856, 427 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 salvo rotate: false - xy: 495, 242 + xy: 602, 378 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 salvo-heat rotate: false - xy: 502, 278 + xy: 548, 324 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 salvo-panel-left rotate: false - xy: 513, 260 + xy: 546, 306 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 salvo-panel-right rotate: false - xy: 513, 242 + xy: 536, 288 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 scatter rotate: false - xy: 998, 367 + xy: 537, 232 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 scorch rotate: false - xy: 988, 347 + xy: 527, 222 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 scorch-shoot rotate: false - xy: 998, 357 + xy: 547, 242 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 spectre rotate: false - xy: 473, 416 + xy: 405, 416 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 swarmer rotate: false - xy: 531, 242 + xy: 584, 360 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 wave rotate: false - xy: 592, 278 + xy: 572, 288 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 wave-liquid rotate: false - xy: 603, 260 + xy: 602, 342 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 dagger-factory-top rotate: false - xy: 964, 461 + xy: 494, 396 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 dagger-factory-top-open rotate: false - xy: 946, 425 + xy: 494, 378 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 fortress-factory rotate: false - xy: 288, 346 + xy: 700, 451 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 fortress-factory-top rotate: false - xy: 340, 338 + xy: 700, 425 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ghoul-factory-top rotate: false - xy: 340, 338 + xy: 700, 425 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 titan-factory-top rotate: false - xy: 340, 338 + xy: 700, 425 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 fortress-factory-top-open rotate: false - xy: 366, 338 + xy: 700, 399 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ghoul-factory-top-open rotate: false - xy: 366, 338 + xy: 700, 399 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 titan-factory-top-open rotate: false - xy: 366, 338 + xy: 700, 399 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ghoul-factory rotate: false - xy: 418, 338 + xy: 726, 427 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 phantom-factory-top rotate: false - xy: 412, 278 + xy: 512, 324 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 phantom-factory-top-open rotate: false - xy: 423, 260 + xy: 566, 396 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 reconstructor-open rotate: false - xy: 466, 278 + xy: 530, 324 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 repair-point-turret rotate: false - xy: 968, 367 + xy: 507, 232 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 revenant-factory rotate: false - xy: 405, 450 + xy: 337, 450 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 revenant-factory-top rotate: false - xy: 405, 416 + xy: 337, 416 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 revenant-factory-top-open rotate: false - xy: 439, 450 + xy: 371, 450 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spirit-factory-top rotate: false - xy: 520, 278 + xy: 536, 270 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 spirit-factory-top-open rotate: false - xy: 531, 260 + xy: 566, 342 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 titan-factory rotate: false - xy: 652, 398 + xy: 934, 453 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 wraith-factory-top rotate: false - xy: 603, 242 + xy: 572, 270 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 wraith-factory-top-open rotate: false - xy: 610, 278 + xy: 567, 252 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 deflector-wall rotate: false - xy: 766, 393 + xy: 144, 88 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 deflector-wall-large rotate: false - xy: 964, 443 + xy: 494, 360 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 door-large-open rotate: false - xy: 982, 461 + xy: 494, 342 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 door-open rotate: false - xy: 738, 358 + xy: 93, 78 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -2330,84 +2330,84 @@ beam index: -1 beam-end rotate: false - xy: 652, 352 + xy: 418, 396 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 blank rotate: false - xy: 415, 210 + xy: 290, 466 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 bullet rotate: false - xy: 389, 195 + xy: 197, 195 size: 13, 13 orig: 13, 13 offset: 0, 0 index: -1 bullet-back rotate: false - xy: 415, 227 + xy: 197, 180 size: 13, 13 orig: 13, 13 offset: 0, 0 index: -1 casing rotate: false - xy: 764, 333 + xy: 85, 198 size: 2, 4 orig: 2, 4 offset: 0, 0 index: -1 clear rotate: false - xy: 300, 466 + xy: 254, 398 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 command-attack rotate: false - xy: 93, 45 + xy: 84, 98 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 command-idle rotate: false - xy: 103, 55 + xy: 134, 138 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 command-patrol rotate: false - xy: 93, 35 + xy: 124, 128 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 command-retreat rotate: false - xy: 103, 45 + xy: 114, 118 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 enemyarrow rotate: false - xy: 758, 359 + xy: 93, 69 size: 8, 7 orig: 8, 7 offset: 0, 0 index: -1 error rotate: false - xy: 99, 176 + xy: 642, 306 size: 12, 12 orig: 12, 12 offset: 0, 0 @@ -2421,161 +2421,161 @@ laser index: -1 laser-end rotate: false - xy: 678, 404 + xy: 418, 376 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 laserfull rotate: false - xy: 678, 384 + xy: 418, 356 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 minelaser rotate: false - xy: 85, 190 + xy: 414, 298 size: 1, 12 orig: 1, 12 offset: 0, 0 index: -1 minelaser-end rotate: false - xy: 698, 408 + xy: 418, 336 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 missile rotate: false - xy: 732, 371 + xy: 868, 416 size: 9, 9 orig: 9, 9 offset: 0, 0 index: -1 missile-back rotate: false - xy: 417, 178 + xy: 314, 312 size: 9, 9 orig: 9, 9 offset: 0, 0 index: -1 scorch1 rotate: false - xy: 1016, 380 + xy: 702, 338 size: 7, 25 orig: 7, 25 offset: 0, 0 index: -1 scorch2 rotate: false - xy: 643, 251 + xy: 702, 311 size: 7, 25 orig: 7, 25 offset: 0, 0 index: -1 scorch3 rotate: false - xy: 752, 291 + xy: 702, 284 size: 7, 25 orig: 7, 25 offset: 0, 0 index: -1 scorch4 rotate: false - xy: 761, 292 + xy: 699, 238 size: 7, 25 orig: 7, 25 offset: 0, 0 index: -1 scorch5 rotate: false - xy: 770, 296 + xy: 211, 153 size: 7, 25 orig: 7, 25 offset: 0, 0 index: -1 shell rotate: false - xy: 85, 165 + xy: 325, 312 size: 9, 9 orig: 9, 9 offset: 0, 0 index: -1 shell-back rotate: false - xy: 96, 165 + xy: 696, 376 size: 9, 9 orig: 9, 9 offset: 0, 0 index: -1 shot rotate: false - xy: 1008, 357 + xy: 557, 242 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 transfer rotate: false - xy: 33, 3 + xy: 1020, 447 size: 1, 12 orig: 1, 12 offset: 0, 0 index: -1 transfer-arrow rotate: false - xy: 628, 278 + xy: 131, 28 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 transfer-end rotate: false - xy: 194, 276 + xy: 438, 350 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 blackstone-cliff-edge rotate: false - xy: 167, 166 + xy: 1012, 427 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blackstone-cliff-edge-1 rotate: false - xy: 177, 166 + xy: 1012, 417 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blackstone-cliff-edge-2 rotate: false - xy: 187, 166 + xy: 1012, 407 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blackstone-cliff-side rotate: false - xy: 83, 155 + xy: 672, 333 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-arc rotate: false - xy: 82, 125 + xy: 672, 313 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-biomattercompressor rotate: false - xy: 662, 328 + xy: 458, 356 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -2589,343 +2589,343 @@ block-icon-blast-drill index: -1 block-icon-bridge-conduit rotate: false - xy: 92, 135 + xy: 656, 307 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 bridge-conduit rotate: false - xy: 92, 135 + xy: 656, 307 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-bridge-conveyor rotate: false - xy: 82, 115 + xy: 662, 297 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 bridge-conveyor rotate: false - xy: 82, 115 + xy: 662, 297 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-centrifuge rotate: false - xy: 680, 328 + xy: 476, 396 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 centrifuge rotate: false - xy: 680, 328 + xy: 476, 396 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-combustion-generator rotate: false - xy: 92, 125 + xy: 662, 287 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 combustion-generator rotate: false - xy: 92, 125 + xy: 662, 287 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-command-center rotate: false - xy: 698, 328 + xy: 476, 378 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 command-center rotate: false - xy: 698, 328 + xy: 476, 378 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-conduit rotate: false - xy: 82, 105 + xy: 662, 277 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-container rotate: false - xy: 588, 321 + xy: 476, 360 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 container rotate: false - xy: 588, 321 + xy: 476, 360 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-conveyor rotate: false - xy: 92, 115 + xy: 662, 267 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-0-0 rotate: false - xy: 92, 115 + xy: 662, 267 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-copper-wall rotate: false - xy: 92, 105 + xy: 672, 303 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 copper-wall rotate: false - xy: 92, 105 + xy: 672, 303 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-copper-wall-large rotate: false - xy: 606, 321 + xy: 752, 393 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 copper-wall-large rotate: false - xy: 606, 321 + xy: 752, 393 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-core rotate: false - xy: 587, 418 + xy: 648, 435 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 core rotate: false - xy: 587, 418 + xy: 648, 435 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-cryofluidmixer rotate: false - xy: 708, 350 + xy: 194, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-cultivator rotate: false - xy: 716, 332 + xy: 212, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-cyclone rotate: false - xy: 613, 424 + xy: 622, 432 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-dagger-factory rotate: false - xy: 624, 310 + xy: 230, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-dart-ship-pad rotate: false - xy: 642, 310 + xy: 770, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 dart-ship-pad rotate: false - xy: 642, 310 + xy: 770, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-deepwater rotate: false - xy: 389, 170 + xy: 672, 293 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 deepwater rotate: false - xy: 389, 170 + xy: 672, 293 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-delta-mech-pad rotate: false - xy: 660, 310 + xy: 788, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 delta-mech-pad rotate: false - xy: 660, 310 + xy: 788, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-dense-alloy-wall rotate: false - xy: 103, 155 + xy: 672, 283 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dense-alloy-wall rotate: false - xy: 103, 155 + xy: 672, 283 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-dense-alloy-wall-large rotate: false - xy: 678, 310 + xy: 806, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 dense-alloy-wall-large rotate: false - xy: 678, 310 + xy: 806, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-dirt rotate: false - xy: 102, 145 + xy: 672, 273 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dirt1 rotate: false - xy: 102, 145 + xy: 672, 273 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-distributor rotate: false - xy: 696, 310 + xy: 824, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 distributor rotate: false - xy: 696, 310 + xy: 824, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-door rotate: false - xy: 102, 135 + xy: 672, 263 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 door rotate: false - xy: 102, 135 + xy: 672, 263 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-door-large rotate: false - xy: 89, 190 + xy: 842, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 door-large rotate: false - xy: 89, 190 + xy: 842, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-duo rotate: false - xy: 102, 125 + xy: 669, 253 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-force-projector rotate: false - xy: 639, 424 + xy: 674, 425 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 force-projector rotate: false - xy: 639, 424 + xy: 674, 425 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-fortress-factory rotate: false - xy: 665, 424 + xy: 648, 409 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-fuse rotate: false - xy: 691, 428 + xy: 674, 399 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-fusion-reactor rotate: false - xy: 893, 479 + xy: 779, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2953,168 +2953,168 @@ glaive-ship-pad index: -1 block-icon-grass rotate: false - xy: 102, 115 + xy: 669, 243 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 grass1 rotate: false - xy: 102, 115 + xy: 669, 243 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-hail rotate: false - xy: 102, 105 + xy: 669, 233 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-ice rotate: false - xy: 113, 156 + xy: 679, 253 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ice1 rotate: false - xy: 113, 156 + xy: 679, 253 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-icerock rotate: false - xy: 123, 156 + xy: 679, 243 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icerock1 rotate: false - xy: 123, 156 + xy: 679, 243 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-incinerator rotate: false - xy: 133, 156 + xy: 679, 233 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 incinerator rotate: false - xy: 133, 156 + xy: 679, 233 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-itemsource rotate: false - xy: 143, 156 + xy: 205, 248 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 itemsource rotate: false - xy: 143, 156 + xy: 205, 248 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-itemvoid rotate: false - xy: 153, 156 + xy: 215, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 itemvoid rotate: false - xy: 153, 156 + xy: 215, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-javelin-ship-pad rotate: false - xy: 107, 190 + xy: 248, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 javelin-ship-pad rotate: false - xy: 107, 190 + xy: 248, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-junction rotate: false - xy: 163, 156 + xy: 225, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 junction rotate: false - xy: 163, 156 + xy: 225, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-lancer rotate: false - xy: 125, 190 + xy: 860, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-laser-drill rotate: false - xy: 143, 190 + xy: 878, 398 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-lava rotate: false - xy: 173, 156 + xy: 235, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 lava rotate: false - xy: 173, 156 + xy: 235, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-liquid-junction rotate: false - xy: 183, 156 + xy: 245, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-junction rotate: false - xy: 183, 156 + xy: 245, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-liquid-router rotate: false - xy: 193, 156 + xy: 255, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -3128,14 +3128,14 @@ block-icon-liquid-tank index: -1 block-icon-liquidsource rotate: false - xy: 203, 158 + xy: 265, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquidsource rotate: false - xy: 203, 158 + xy: 265, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -3156,70 +3156,70 @@ mass-driver index: -1 block-icon-mechanical-drill rotate: false - xy: 161, 190 + xy: 878, 380 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-mechanical-pump rotate: false - xy: 213, 158 + xy: 275, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 mechanical-pump rotate: false - xy: 213, 158 + xy: 275, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-meltdown rotate: false - xy: 927, 479 + xy: 813, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-icon-melter rotate: false - xy: 223, 158 + xy: 285, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 melter rotate: false - xy: 223, 158 + xy: 285, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-mend-projector rotate: false - xy: 179, 190 + xy: 532, 432 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 mend-projector rotate: false - xy: 179, 190 + xy: 532, 432 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-metalfloor rotate: false - xy: 233, 158 + xy: 295, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor1 rotate: false - xy: 233, 158 + xy: 295, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -3233,1995 +3233,1995 @@ block-icon-oil-extractor index: -1 block-icon-omega-mech-pad rotate: false - xy: 418, 390 + xy: 340, 364 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 omega-mech-pad rotate: false - xy: 418, 390 + xy: 340, 364 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-overdrive-projector rotate: false - xy: 748, 466 + xy: 550, 432 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 overdrive-projector rotate: false - xy: 748, 466 + xy: 550, 432 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-overflow-gate rotate: false - xy: 243, 158 + xy: 305, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 overflow-gate rotate: false - xy: 243, 158 + xy: 305, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-phantom-factory rotate: false - xy: 766, 469 + xy: 568, 432 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-phase-conduit rotate: false - xy: 253, 158 + xy: 315, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 phase-conduit rotate: false - xy: 253, 158 + xy: 315, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-phase-conveyor rotate: false - xy: 263, 158 + xy: 325, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 phase-conveyor rotate: false - xy: 263, 158 + xy: 325, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-phase-wall rotate: false - xy: 273, 158 + xy: 335, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 phase-wall rotate: false - xy: 273, 158 + xy: 335, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-phase-wall-large rotate: false - xy: 748, 448 + xy: 586, 432 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 phase-wall-large rotate: false - xy: 748, 448 + xy: 586, 432 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-phase-weaver rotate: false - xy: 766, 451 + xy: 604, 432 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-plasma-drill rotate: false - xy: 961, 479 + xy: 847, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-icon-plastanium-compressor rotate: false - xy: 784, 459 + xy: 527, 414 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 plastanium-compressor rotate: false - xy: 784, 459 + xy: 527, 414 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-pneumatic-drill rotate: false - xy: 802, 459 + xy: 545, 414 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-power-node rotate: false - xy: 283, 158 + xy: 345, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 power-node rotate: false - xy: 283, 158 + xy: 345, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-power-node-large rotate: false - xy: 784, 441 + xy: 563, 414 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 power-node-large rotate: false - xy: 784, 441 + xy: 563, 414 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-powerinfinite rotate: false - xy: 293, 158 + xy: 355, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 powerinfinite rotate: false - xy: 293, 158 + xy: 355, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-powervoid rotate: false - xy: 303, 158 + xy: 365, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 powervoid rotate: false - xy: 303, 158 + xy: 365, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-pulse-conduit rotate: false - xy: 313, 158 + xy: 375, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-pulverizer rotate: false - xy: 323, 158 + xy: 385, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-pyratite-mixer rotate: false - xy: 802, 441 + xy: 581, 414 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 pyratite-mixer rotate: false - xy: 802, 441 + xy: 581, 414 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-reconstructor rotate: false - xy: 766, 433 + xy: 599, 414 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 dagger-factory rotate: false - xy: 766, 433 + xy: 599, 414 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 phantom-factory rotate: false - xy: 766, 433 + xy: 599, 414 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 reconstructor rotate: false - xy: 766, 433 + xy: 599, 414 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 spirit-factory rotate: false - xy: 766, 433 + xy: 599, 414 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 wraith-factory rotate: false - xy: 766, 433 + xy: 599, 414 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-repair-point rotate: false - xy: 333, 158 + xy: 395, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 repair-point rotate: false - xy: 333, 158 + xy: 395, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-revenant-factory rotate: false - xy: 92, 276 + xy: 881, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-icon-ripple rotate: false - xy: 444, 390 + xy: 366, 364 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-rock rotate: false - xy: 343, 158 + xy: 405, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 rock1 rotate: false - xy: 343, 158 + xy: 405, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-rotary-pump rotate: false - xy: 784, 423 + xy: 617, 414 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 rotary-pump rotate: false - xy: 784, 423 + xy: 617, 414 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-router rotate: false - xy: 353, 158 + xy: 415, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 router rotate: false - xy: 353, 158 + xy: 415, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-rtg-generator rotate: false - xy: 802, 423 + xy: 980, 435 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 rtg-generator rotate: false - xy: 802, 423 + xy: 980, 435 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-salvo rotate: false - xy: 820, 459 + xy: 980, 417 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-sand rotate: false - xy: 363, 158 + xy: 425, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand1 rotate: false - xy: 363, 158 + xy: 425, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-scorch rotate: false - xy: 373, 158 + xy: 435, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-separator rotate: false - xy: 383, 158 + xy: 445, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 separator rotate: false - xy: 383, 158 + xy: 445, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-shock-mine rotate: false - xy: 393, 160 + xy: 455, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 shock-mine rotate: false - xy: 393, 160 + xy: 455, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-shrub rotate: false - xy: 68, 92 + xy: 465, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 shrub rotate: false - xy: 68, 92 + xy: 465, 250 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-silicon-smelter rotate: false - xy: 820, 441 + xy: 962, 397 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 silicon-smelter rotate: false - xy: 820, 441 + xy: 962, 397 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-smelter rotate: false - xy: 67, 82 + xy: 85, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 smelter rotate: false - xy: 67, 82 + xy: 85, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-snow rotate: false - xy: 67, 72 + xy: 95, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow1 rotate: false - xy: 67, 72 + xy: 95, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-solar-panel rotate: false - xy: 78, 92 + xy: 105, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 solar-panel rotate: false - xy: 78, 92 + xy: 105, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-solar-panel-large rotate: false - xy: 470, 390 + xy: 392, 364 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 solar-panel-large rotate: false - xy: 470, 390 + xy: 392, 364 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-solidifer rotate: false - xy: 77, 82 + xy: 115, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 solidifer rotate: false - xy: 77, 82 + xy: 115, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-sorter rotate: false - xy: 77, 72 + xy: 125, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sorter rotate: false - xy: 77, 72 + xy: 125, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-space rotate: false - xy: 88, 95 + xy: 135, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 space rotate: false - xy: 88, 95 + xy: 135, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-spawn rotate: false - xy: 98, 95 + xy: 145, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 spawn rotate: false - xy: 98, 95 + xy: 145, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-spectre rotate: false - xy: 126, 276 + xy: 915, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-icon-spirit-factory rotate: false - xy: 820, 423 + xy: 980, 399 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-stone rotate: false - xy: 108, 95 + xy: 155, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 stone1 rotate: false - xy: 108, 95 + xy: 155, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-surge-wall rotate: false - xy: 747, 438 + xy: 165, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 surge-wall rotate: false - xy: 747, 438 + xy: 165, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-surge-wall-large rotate: false - xy: 838, 461 + xy: 458, 338 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 surge-wall-large rotate: false - xy: 838, 461 + xy: 458, 338 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-swarmer rotate: false - xy: 838, 443 + xy: 476, 342 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-tar rotate: false - xy: 399, 173 + xy: 175, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 tar rotate: false - xy: 399, 173 + xy: 175, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-tau-mech-pad rotate: false - xy: 856, 461 + xy: 456, 320 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 tau-mech-pad rotate: false - xy: 856, 461 + xy: 456, 320 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-thermal-generator rotate: false - xy: 838, 425 + xy: 896, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 thermal-generator rotate: false - xy: 838, 425 + xy: 896, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-thermal-pump rotate: false - xy: 856, 443 + xy: 914, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 thermal-pump rotate: false - xy: 856, 443 + xy: 914, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-thorium-reactor rotate: false - xy: 496, 390 + xy: 314, 349 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 thorium-reactor rotate: false - xy: 496, 390 + xy: 314, 349 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-thorium-wall rotate: false - xy: 83, 62 + xy: 185, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 thorium-wall rotate: false - xy: 83, 62 + xy: 185, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-thorium-wall-large rotate: false - xy: 874, 461 + xy: 932, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 thorium-wall-large rotate: false - xy: 874, 461 + xy: 932, 391 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-titan-factory rotate: false - xy: 340, 364 + xy: 288, 346 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-titanium-conveyor rotate: false - xy: 83, 52 + xy: 84, 138 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-0-0 rotate: false - xy: 83, 52 + xy: 84, 138 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-trident-ship-pad rotate: false - xy: 856, 425 + xy: 896, 373 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 trident-ship-pad rotate: false - xy: 856, 425 + xy: 896, 373 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-turbine-generator rotate: false - xy: 874, 443 + xy: 914, 373 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 turbine-generator rotate: false - xy: 874, 443 + xy: 914, 373 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-unloader rotate: false - xy: 83, 42 + xy: 94, 138 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 unloader rotate: false - xy: 83, 42 + xy: 94, 138 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-vault rotate: false - xy: 366, 364 + xy: 340, 338 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 vault rotate: false - xy: 366, 364 + xy: 340, 338 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icon-water rotate: false - xy: 83, 32 + xy: 84, 128 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 water rotate: false - xy: 83, 32 + xy: 84, 128 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-water-extractor rotate: false - xy: 892, 461 + xy: 932, 373 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-wave rotate: false - xy: 874, 425 + xy: 456, 302 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icon-wraith-factory rotate: false - xy: 892, 443 + xy: 950, 379 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 deepwater-cliff-edge rotate: false - xy: 766, 413 + xy: 104, 88 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 deepwater-cliff-edge-1 rotate: false - xy: 756, 398 + xy: 114, 88 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 deepwater-cliff-edge-2 rotate: false - xy: 766, 403 + xy: 124, 88 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 deepwater-cliff-side rotate: false - xy: 756, 388 + xy: 134, 88 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dirt-cliff-edge rotate: false - xy: 756, 378 + xy: 174, 88 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dirt-cliff-edge-1 rotate: false - xy: 766, 373 + xy: 184, 88 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dirt-cliff-edge-2 rotate: false - xy: 743, 368 + xy: 83, 78 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dirt-cliff-side rotate: false - xy: 753, 368 + xy: 83, 68 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 lava-cliff-edge rotate: false - xy: 786, 393 + xy: 133, 48 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 lava-cliff-edge-1 rotate: false - xy: 796, 403 + xy: 143, 48 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 lava-cliff-edge-2 rotate: false - xy: 806, 413 + xy: 153, 48 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 lava-cliff-side rotate: false - xy: 786, 383 + xy: 163, 48 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-icon-cryofluid rotate: false - xy: 796, 383 + xy: 1004, 365 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-icon-lava rotate: false - xy: 806, 393 + xy: 1014, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-icon-oil rotate: false - xy: 816, 403 + xy: 1014, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-icon-water rotate: false - xy: 826, 413 + xy: 1014, 377 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 mech-icon-alpha-mech rotate: false - xy: 225, 180 + xy: 599, 250 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 mech-icon-dart-ship rotate: false - xy: 239, 180 + xy: 613, 250 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 mech-icon-delta-mech rotate: false - xy: 253, 180 + xy: 627, 250 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 mech-icon-omega-mech rotate: false - xy: 351, 210 + xy: 165, 158 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 mech-icon-tau-mech rotate: false - xy: 341, 194 + xy: 181, 158 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 mech-icon-trident-ship rotate: false - xy: 367, 226 + xy: 68, 140 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 trident-ship rotate: false - xy: 367, 226 + xy: 68, 140 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 metalfloor-cliff-edge rotate: false - xy: 806, 373 + xy: 682, 333 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor-cliff-edge-1 rotate: false - xy: 798, 363 + xy: 682, 323 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor-cliff-edge-2 rotate: false - xy: 816, 383 + xy: 682, 313 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor-cliff-side rotate: false - xy: 826, 393 + xy: 682, 303 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-blackstone1 rotate: false - xy: 798, 353 + xy: 682, 283 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-blackstone2 rotate: false - xy: 816, 373 + xy: 682, 273 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-blackstone3 rotate: false - xy: 808, 363 + xy: 682, 263 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-grass1 rotate: false - xy: 826, 383 + xy: 692, 355 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-grass2 rotate: false - xy: 798, 343 + xy: 692, 345 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-grass3 rotate: false - xy: 808, 353 + xy: 692, 335 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-ice1 rotate: false - xy: 826, 373 + xy: 692, 325 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-ice2 rotate: false - xy: 818, 363 + xy: 692, 315 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-ice3 rotate: false - xy: 808, 343 + xy: 692, 305 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-sand1 rotate: false - xy: 818, 353 + xy: 692, 295 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-sand2 rotate: false - xy: 818, 343 + xy: 692, 285 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-sand3 rotate: false - xy: 836, 397 + xy: 692, 275 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-snow1 rotate: false - xy: 836, 387 + xy: 692, 265 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-snow2 rotate: false - xy: 846, 397 + xy: 689, 253 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-snow3 rotate: false - xy: 836, 377 + xy: 689, 243 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-stone1 rotate: false - xy: 846, 387 + xy: 689, 233 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-stone2 rotate: false - xy: 856, 397 + xy: 207, 238 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-stone3 rotate: false - xy: 846, 377 + xy: 207, 228 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-blackstone1 rotate: false - xy: 856, 387 + xy: 207, 218 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-blackstone2 rotate: false - xy: 866, 397 + xy: 217, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-blackstone3 rotate: false - xy: 856, 377 + xy: 217, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-grass1 rotate: false - xy: 866, 387 + xy: 227, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-grass2 rotate: false - xy: 876, 397 + xy: 217, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-grass3 rotate: false - xy: 866, 377 + xy: 227, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-ice1 rotate: false - xy: 876, 387 + xy: 237, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-ice2 rotate: false - xy: 886, 397 + xy: 227, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-ice3 rotate: false - xy: 876, 377 + xy: 237, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-sand1 rotate: false - xy: 886, 387 + xy: 247, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-sand2 rotate: false - xy: 896, 397 + xy: 237, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-sand3 rotate: false - xy: 886, 377 + xy: 247, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-snow1 rotate: false - xy: 896, 387 + xy: 257, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-snow2 rotate: false - xy: 906, 397 + xy: 247, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-snow3 rotate: false - xy: 896, 377 + xy: 257, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-stone1 rotate: false - xy: 906, 387 + xy: 267, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-stone2 rotate: false - xy: 916, 397 + xy: 257, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-stone3 rotate: false - xy: 906, 377 + xy: 267, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-blackstone1 rotate: false - xy: 916, 387 + xy: 277, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-blackstone2 rotate: false - xy: 926, 397 + xy: 267, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-blackstone3 rotate: false - xy: 916, 377 + xy: 277, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-grass1 rotate: false - xy: 926, 387 + xy: 287, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-grass2 rotate: false - xy: 936, 397 + xy: 277, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-grass3 rotate: false - xy: 926, 377 + xy: 287, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-ice1 rotate: false - xy: 936, 387 + xy: 297, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-ice2 rotate: false - xy: 946, 397 + xy: 287, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-ice3 rotate: false - xy: 936, 377 + xy: 297, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-sand1 rotate: false - xy: 946, 387 + xy: 307, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-sand2 rotate: false - xy: 956, 397 + xy: 297, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-sand3 rotate: false - xy: 946, 377 + xy: 307, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-snow1 rotate: false - xy: 956, 387 + xy: 317, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-snow2 rotate: false - xy: 966, 397 + xy: 307, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-snow3 rotate: false - xy: 956, 377 + xy: 317, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-stone1 rotate: false - xy: 966, 387 + xy: 327, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-stone2 rotate: false - xy: 976, 397 + xy: 317, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-stone3 rotate: false - xy: 966, 377 + xy: 327, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-blackstone1 rotate: false - xy: 976, 387 + xy: 337, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-blackstone2 rotate: false - xy: 986, 397 + xy: 327, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-blackstone3 rotate: false - xy: 976, 377 + xy: 337, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-grass1 rotate: false - xy: 986, 387 + xy: 347, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-grass2 rotate: false - xy: 996, 397 + xy: 337, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-grass3 rotate: false - xy: 986, 377 + xy: 347, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-ice1 rotate: false - xy: 996, 387 + xy: 357, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-ice2 rotate: false - xy: 1006, 397 + xy: 347, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-ice3 rotate: false - xy: 996, 377 + xy: 357, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-sand1 rotate: false - xy: 1006, 387 + xy: 367, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-sand2 rotate: false - xy: 1006, 377 + xy: 357, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-sand3 rotate: false - xy: 828, 363 + xy: 367, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-snow1 rotate: false - xy: 828, 353 + xy: 377, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-snow2 rotate: false - xy: 828, 343 + xy: 367, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-snow3 rotate: false - xy: 838, 367 + xy: 377, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-stone1 rotate: false - xy: 838, 357 + xy: 387, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-stone2 rotate: false - xy: 848, 367 + xy: 377, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-stone3 rotate: false - xy: 838, 347 + xy: 387, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-blackstone1 rotate: false - xy: 848, 357 + xy: 397, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-blackstone2 rotate: false - xy: 858, 367 + xy: 387, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-blackstone3 rotate: false - xy: 848, 347 + xy: 397, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-grass1 rotate: false - xy: 858, 357 + xy: 407, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-grass2 rotate: false - xy: 868, 367 + xy: 397, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-grass3 rotate: false - xy: 858, 347 + xy: 407, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-ice1 rotate: false - xy: 868, 357 + xy: 417, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-ice2 rotate: false - xy: 878, 367 + xy: 407, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-ice3 rotate: false - xy: 868, 347 + xy: 417, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-sand1 rotate: false - xy: 878, 357 + xy: 427, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-sand2 rotate: false - xy: 888, 367 + xy: 417, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-sand3 rotate: false - xy: 878, 347 + xy: 427, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-snow1 rotate: false - xy: 888, 357 + xy: 437, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-snow2 rotate: false - xy: 898, 367 + xy: 427, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-snow3 rotate: false - xy: 888, 347 + xy: 437, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-stone1 rotate: false - xy: 898, 357 + xy: 447, 240 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-stone2 rotate: false - xy: 908, 367 + xy: 437, 220 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-stone3 rotate: false - xy: 898, 347 + xy: 447, 230 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand-cliff-edge rotate: false - xy: 978, 357 + xy: 527, 242 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand-cliff-edge-1 rotate: false - xy: 988, 367 + xy: 527, 232 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand-cliff-edge-2 rotate: false - xy: 978, 347 + xy: 517, 222 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand-cliff-side rotate: false - xy: 988, 357 + xy: 537, 242 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow-cliff-edge rotate: false - xy: 858, 337 + xy: 567, 232 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow-cliff-edge-1 rotate: false - xy: 868, 337 + xy: 557, 222 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow-cliff-edge-2 rotate: false - xy: 878, 337 + xy: 567, 222 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow-cliff-side rotate: false - xy: 888, 337 + xy: 195, 142 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 space-cliff-edge rotate: false - xy: 908, 337 + xy: 194, 122 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 space-cliff-edge-1 rotate: false - xy: 918, 337 + xy: 194, 112 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 space-cliff-edge-2 rotate: false - xy: 928, 337 + xy: 194, 102 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 space-cliff-side rotate: false - xy: 938, 337 + xy: 194, 92 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 tar-cliff-edge rotate: false - xy: 1008, 337 + xy: 194, 82 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 tar-cliff-edge-1 rotate: false - xy: 738, 348 + xy: 204, 82 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 tar-cliff-edge-2 rotate: false - xy: 748, 348 + xy: 193, 72 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 tar-cliff-side rotate: false - xy: 758, 339 + xy: 193, 62 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 unit-icon-dagger rotate: false - xy: 68, 116 + xy: 726, 387 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 unit-icon-fortress rotate: false - xy: 556, 278 + xy: 584, 342 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-icon-titan rotate: false - xy: 567, 260 + xy: 602, 360 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-icon-wraith rotate: false - xy: 68, 102 + xy: 986, 349 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 wraith rotate: false - xy: 68, 102 + xy: 986, 349 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 item-biomatter rotate: false - xy: 343, 148 + xy: 143, 58 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-blast-compound rotate: false - xy: 353, 148 + xy: 153, 68 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-coal rotate: false - xy: 363, 148 + xy: 163, 78 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-copper rotate: false - xy: 373, 148 + xy: 153, 58 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-dense-alloy rotate: false - xy: 383, 148 + xy: 163, 68 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-lead rotate: false - xy: 393, 140 + xy: 173, 78 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-phase-fabric rotate: false - xy: 403, 133 + xy: 163, 58 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-plastanium rotate: false - xy: 776, 413 + xy: 173, 68 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-pyratite rotate: false - xy: 776, 403 + xy: 183, 78 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-sand rotate: false - xy: 786, 413 + xy: 173, 58 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-silicon rotate: false - xy: 776, 393 + xy: 183, 68 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-stone rotate: false - xy: 786, 403 + xy: 183, 58 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-surge-alloy rotate: false - xy: 796, 413 + xy: 103, 48 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-thorium rotate: false - xy: 776, 383 + xy: 113, 48 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-titanium rotate: false - xy: 776, 373 + xy: 123, 48 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-icon rotate: false - xy: 778, 363 + xy: 1004, 375 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 alpha-mech rotate: false - xy: 415, 213 + xy: 197, 166 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 alpha-mech-base rotate: false - xy: 430, 228 + xy: 197, 152 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 alpha-mech-leg rotate: false - xy: 444, 228 + xy: 274, 324 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 delta-mech rotate: false - xy: 584, 228 + xy: 628, 306 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 delta-mech-base rotate: false - xy: 598, 228 + xy: 632, 320 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 delta-mech-leg rotate: false - xy: 404, 196 + xy: 634, 292 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 omega-mech rotate: false - xy: 367, 210 + xy: 68, 124 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 omega-mech-armor rotate: false - xy: 357, 194 + xy: 68, 108 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 omega-mech-base rotate: false - xy: 383, 226 + xy: 68, 92 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 omega-mech-leg rotate: false - xy: 383, 210 + xy: 67, 76 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 tau-mech rotate: false - xy: 399, 210 + xy: 620, 334 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 tau-mech-base rotate: false - xy: 68, 144 + xy: 998, 419 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 tau-mech-leg rotate: false - xy: 68, 130 + xy: 998, 405 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 dart-ship rotate: false - xy: 570, 228 + xy: 620, 278 size: 12, 12 orig: 12, 12 offset: 0, 0 @@ -5242,21 +5242,21 @@ mech-icon-glaive-ship index: -1 javelin-ship rotate: false - xy: 183, 176 + xy: 634, 264 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 mech-icon-javelin-ship rotate: false - xy: 183, 176 + xy: 634, 264 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 javelin-ship-shield rotate: false - xy: 197, 180 + xy: 648, 264 size: 12, 12 orig: 12, 12 offset: 0, 0 @@ -5277,7 +5277,7 @@ shape-3 index: -1 button rotate: false - xy: 562, 484 + xy: 486, 484 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -5323,15 +5323,7 @@ button-edge-4 orig: 36, 27 offset: 0, 0 index: -1 -button-left - rotate: false - xy: 448, 484 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-left-down +button-over rotate: false xy: 410, 484 size: 36, 27 @@ -5339,15 +5331,7 @@ button-left-down orig: 36, 27 offset: 0, 0 index: -1 -button-left-over - rotate: false - xy: 1, 75 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-over +button-right rotate: false xy: 1, 46 size: 36, 27 @@ -5355,17 +5339,9 @@ button-over orig: 36, 27 offset: 0, 0 index: -1 -button-right - rotate: false - xy: 524, 484 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 button-right-down rotate: false - xy: 486, 484 + xy: 1, 75 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -5373,7 +5349,7 @@ button-right-down index: -1 button-right-over rotate: false - xy: 1, 17 + xy: 448, 484 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -5381,7 +5357,7 @@ button-right-over index: -1 button-select rotate: false - xy: 392, 364 + xy: 366, 338 size: 24, 24 split: 4, 4, 4, 4 orig: 24, 24 @@ -5389,42 +5365,42 @@ button-select index: -1 check-off rotate: false - xy: 995, 479 + xy: 532, 450 size: 28, 32 orig: 28, 32 offset: 0, 0 index: -1 check-on rotate: false - xy: 600, 450 + xy: 562, 450 size: 28, 32 orig: 28, 32 offset: 0, 0 index: -1 check-on-over rotate: false - xy: 630, 450 + xy: 592, 450 size: 28, 32 orig: 28, 32 offset: 0, 0 index: -1 check-over rotate: false - xy: 660, 450 + xy: 439, 410 size: 28, 32 orig: 28, 32 offset: 0, 0 index: -1 clear rotate: false - xy: 242, 339 + xy: 950, 397 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 cursor rotate: false - xy: 600, 444 + xy: 998, 399 size: 4, 4 orig: 4, 4 offset: 0, 0 @@ -5438,84 +5414,84 @@ discord-banner index: -1 empty-sector rotate: false - xy: 87, 242 + xy: 983, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-crafting rotate: false - xy: 717, 436 + xy: 266, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-defense rotate: false - xy: 718, 418 + xy: 279, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-distribution rotate: false - xy: 718, 400 + xy: 284, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-effect rotate: false - xy: 718, 382 + xy: 297, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-liquid rotate: false - xy: 892, 407 + xy: 374, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-power rotate: false - xy: 268, 278 + xy: 459, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-production rotate: false - xy: 279, 260 + xy: 476, 324 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-turret rotate: false - xy: 315, 242 + xy: 510, 306 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-units rotate: false - xy: 333, 260 + xy: 482, 270 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-upgrade rotate: false - xy: 340, 278 + xy: 518, 270 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 controller-cursor rotate: false - xy: 892, 425 + xy: 986, 381 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -5536,231 +5512,238 @@ icon-add index: -1 icon-admin rotate: false - xy: 65, 19 + xy: 33, 1 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-admin-small rotate: false - xy: 332, 341 + xy: 1017, 505 size: 6, 6 orig: 6, 6 offset: 0, 0 index: -1 icon-areaDelete rotate: false - xy: 393, 183 + xy: 302, 334 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-arrow rotate: false - xy: 982, 425 + xy: 125, 190 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-arrow-16 rotate: false - xy: 982, 425 + xy: 125, 190 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-arrow-down rotate: false - xy: 405, 184 + xy: 302, 322 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-arrow-left rotate: false - xy: 612, 230 + xy: 740, 389 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-arrow-right rotate: false - xy: 418, 201 + xy: 274, 312 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-arrow-up rotate: false - xy: 621, 266 + xy: 635, 420 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-back rotate: false - xy: 1000, 443 + xy: 143, 190 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-ban rotate: false - xy: 242, 322 + xy: 49, 1 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-break rotate: false - xy: 1000, 425 + xy: 161, 190 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-cancel rotate: false - xy: 716, 314 + xy: 179, 190 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-chat rotate: false - xy: 621, 254 + xy: 636, 408 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-check rotate: false - xy: 314, 331 + xy: 418, 298 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-copy + rotate: false + xy: 436, 296 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-cursor rotate: false - xy: 621, 242 + xy: 636, 396 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-dev-builds rotate: false - xy: 189, 242 + xy: 242, 322 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-discord rotate: false - xy: 69, 188 + xy: 189, 242 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-donate rotate: false - xy: 258, 322 + xy: 69, 188 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-dots rotate: false - xy: 256, 306 + xy: 256, 296 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-editor rotate: false - xy: 205, 242 + xy: 602, 326 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-egg rotate: false - xy: 191, 226 + xy: 69, 172 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-elevation rotate: false - xy: 65, 53 + xy: 302, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-eraser rotate: false - xy: 65, 35 + xy: 315, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-exit rotate: false - xy: 69, 172 + xy: 272, 296 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-file rotate: false - xy: 225, 242 + xy: 320, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-file-image rotate: false - xy: 243, 242 + xy: 333, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-file-text rotate: false - xy: 191, 210 + xy: 258, 322 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-fill rotate: false - xy: 261, 242 + xy: 338, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-floppy rotate: false - xy: 207, 226 + xy: 288, 296 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-floppy-16 rotate: false - xy: 838, 407 + xy: 351, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-folder rotate: false - xy: 207, 210 + xy: 304, 296 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-folder-parent rotate: false - xy: 197, 194 + xy: 320, 296 size: 14, 14 orig: 14, 14 offset: 0, 0 @@ -5774,455 +5757,462 @@ icon-generated index: -1 icon-github rotate: false - xy: 223, 226 + xy: 336, 296 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-google-play rotate: false - xy: 223, 210 + xy: 352, 296 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-grid rotate: false - xy: 856, 407 + xy: 356, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-hold rotate: false - xy: 624, 230 + xy: 648, 397 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-holdDelete rotate: false - xy: 75, 7 + xy: 636, 384 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-home rotate: false - xy: 213, 194 + xy: 368, 296 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-host rotate: false - xy: 239, 226 + xy: 384, 296 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-info rotate: false - xy: 274, 326 + xy: 660, 397 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-itch.io rotate: false - xy: 239, 210 + xy: 620, 398 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-item rotate: false - xy: 726, 356 + xy: 648, 385 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-items-none rotate: false - xy: 323, 148 + xy: 143, 68 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icon-line rotate: false - xy: 874, 407 + xy: 369, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-link rotate: false - xy: 229, 194 + xy: 620, 382 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-liquid-small rotate: false - xy: 418, 189 + xy: 636, 372 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-load rotate: false - xy: 255, 226 + xy: 620, 366 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-load-image rotate: false - xy: 910, 407 + xy: 387, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-load-map rotate: false - xy: 928, 407 + xy: 392, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-loading rotate: false - xy: 946, 407 + xy: 410, 280 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-locked rotate: false - xy: 964, 407 + xy: 428, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-logic rotate: false - xy: 197, 168 + xy: 660, 385 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-map rotate: false - xy: 255, 210 + xy: 620, 350 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-menu rotate: false - xy: 209, 168 + xy: 648, 373 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-menu-large rotate: false - xy: 982, 407 + xy: 446, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-missing rotate: false - xy: 221, 168 + xy: 636, 360 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-mission-background rotate: false - xy: 568, 320 + xy: 986, 459 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 icon-mission-battle rotate: false - xy: 233, 168 + xy: 648, 361 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-mission-defense rotate: false - xy: 245, 168 + xy: 660, 373 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-mission-done rotate: false - xy: 257, 168 + xy: 636, 348 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-none rotate: false - xy: 269, 168 + xy: 648, 349 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-nullitem rotate: false - xy: 333, 148 + xy: 153, 78 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 +icon-paste + rotate: false + xy: 405, 260 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 icon-pause rotate: false - xy: 281, 168 + xy: 660, 361 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-pencil rotate: false - xy: 1000, 407 + xy: 423, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-pencil-small rotate: false - xy: 245, 194 + xy: 191, 226 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-pick rotate: false - xy: 714, 296 + xy: 441, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-play rotate: false - xy: 293, 168 + xy: 636, 336 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-play-2 rotate: false - xy: 271, 226 + xy: 191, 210 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-players rotate: false - xy: 305, 168 + xy: 648, 337 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-power-small rotate: false - xy: 317, 168 + xy: 660, 349 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-quit rotate: false - xy: 271, 210 + xy: 85, 174 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-redo rotate: false - xy: 279, 242 + xy: 494, 324 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-refresh rotate: false - xy: 261, 194 + xy: 101, 174 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-rename rotate: false - xy: 287, 226 + xy: 117, 174 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-resize rotate: false - xy: 286, 278 + xy: 474, 306 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-rotate rotate: false - xy: 287, 210 + xy: 133, 174 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-rotate-arrow rotate: false - xy: 277, 194 + xy: 149, 174 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-rotate-left rotate: false - xy: 303, 226 + xy: 165, 174 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-rotate-right rotate: false - xy: 303, 210 + xy: 181, 174 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-save rotate: false - xy: 293, 194 + xy: 590, 290 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-save-image rotate: false - xy: 297, 260 + xy: 492, 306 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-save-map rotate: false - xy: 297, 242 + xy: 464, 284 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-settings rotate: false - xy: 329, 168 + xy: 660, 337 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-terrain rotate: false - xy: 304, 278 + xy: 482, 288 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-tools rotate: false - xy: 319, 226 + xy: 590, 274 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-touch rotate: false - xy: 341, 168 + xy: 672, 387 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-touchDelete rotate: false - xy: 353, 168 + xy: 672, 375 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-trash rotate: false - xy: 319, 210 + xy: 69, 156 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-trash-16 rotate: false - xy: 315, 260 + xy: 500, 288 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-trello rotate: false - xy: 309, 194 + xy: 85, 158 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-tutorial rotate: false - xy: 335, 226 + xy: 101, 158 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-undo rotate: false - xy: 322, 278 + xy: 518, 288 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-unlocked rotate: false - xy: 333, 242 + xy: 500, 270 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-unlocks rotate: false - xy: 335, 210 + xy: 117, 158 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-wiki rotate: false - xy: 325, 194 + xy: 133, 158 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 icon-zoom rotate: false - xy: 351, 260 + xy: 477, 252 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-zoom-small rotate: false - xy: 351, 226 + xy: 149, 158 size: 14, 14 orig: 14, 14 offset: 0, 0 @@ -6236,7 +6226,7 @@ info-banner index: -1 inventory rotate: false - xy: 522, 374 + xy: 752, 437 size: 24, 40 split: 10, 10, 10, 14 orig: 24, 40 @@ -6251,7 +6241,7 @@ logotext index: -1 pane rotate: false - xy: 638, 484 + xy: 524, 484 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -6259,7 +6249,7 @@ pane index: -1 pane-2 rotate: false - xy: 600, 484 + xy: 1, 17 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -6267,7 +6257,7 @@ pane-2 index: -1 scroll rotate: false - xy: 600, 339 + xy: 882, 416 size: 24, 35 split: 10, 10, 6, 5 orig: 24, 35 @@ -6275,7 +6265,7 @@ scroll index: -1 scroll-horizontal rotate: false - xy: 752, 487 + xy: 638, 487 size: 35, 24 split: 6, 5, 10, 10 orig: 35, 24 @@ -6291,7 +6281,7 @@ scroll-knob-horizontal-black index: -1 scroll-knob-vertical-black rotate: false - xy: 600, 376 + xy: 65, 1 size: 24, 40 split: 10, 10, 6, 10 orig: 24, 40 @@ -6299,63 +6289,63 @@ scroll-knob-vertical-black index: -1 sector-edge rotate: false - xy: 439, 416 + xy: 371, 416 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sector-select rotate: false - xy: 473, 450 + xy: 405, 450 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 selection rotate: false - xy: 254, 398 + xy: 303, 398 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 slider rotate: false - xy: 784, 477 + xy: 879, 417 size: 1, 8 orig: 1, 8 offset: 0, 0 index: -1 slider-knob rotate: false - xy: 507, 444 + xy: 439, 444 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-down rotate: false - xy: 538, 444 + xy: 470, 444 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-over rotate: false - xy: 569, 444 + xy: 501, 444 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-vertical rotate: false - xy: 290, 466 + xy: 638, 484 size: 8, 1 orig: 8, 1 offset: 0, 0 index: -1 underline rotate: false - xy: 714, 484 + xy: 600, 484 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -6363,7 +6353,7 @@ underline index: -1 underline-2 rotate: false - xy: 676, 484 + xy: 562, 484 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -6371,7 +6361,7 @@ underline-2 index: -1 white rotate: false - xy: 763, 368 + xy: 87, 282 size: 3, 3 orig: 3, 3 offset: 0, 0 @@ -6386,210 +6376,210 @@ window-empty index: -1 alpha-drone rotate: false - xy: 718, 368 + xy: 400, 298 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 unit-icon-alpha-drone rotate: false - xy: 718, 368 + xy: 400, 298 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 dagger rotate: false - xy: 528, 228 + xy: 606, 292 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 dagger-base rotate: false - xy: 542, 228 + xy: 606, 278 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 dagger-leg rotate: false - xy: 556, 228 + xy: 620, 292 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 fortress rotate: false - xy: 964, 425 + xy: 261, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 fortress-base rotate: false - xy: 982, 443 + xy: 89, 190 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 titan-base rotate: false - xy: 982, 443 + xy: 89, 190 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 fortress-leg rotate: false - xy: 1000, 461 + xy: 107, 190 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 ghoul rotate: false - xy: 548, 320 + xy: 960, 433 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 unit-icon-ghoul rotate: false - xy: 548, 320 + xy: 960, 433 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 phantom rotate: false - xy: 373, 194 + xy: 67, 60 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 unit-icon-phantom rotate: false - xy: 373, 194 + xy: 67, 60 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 power-cell rotate: false - xy: 399, 226 + xy: 67, 44 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 revenant rotate: false - xy: 690, 454 + xy: 469, 414 size: 28, 28 orig: 28, 28 offset: 0, 0 index: -1 unit-icon-revenant rotate: false - xy: 690, 454 + xy: 469, 414 size: 28, 28 orig: 28, 28 offset: 0, 0 index: -1 spirit rotate: false - xy: 337, 180 + xy: 655, 250 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 unit-icon-spirit rotate: false - xy: 337, 180 + xy: 655, 250 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 titan rotate: false - xy: 538, 278 + xy: 566, 324 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 titan-leg rotate: false - xy: 549, 260 + xy: 564, 306 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 artillery-equip rotate: false - xy: 458, 228 + xy: 618, 320 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 blaster-equip rotate: false - xy: 486, 228 + xy: 288, 318 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 bomber-equip rotate: false - xy: 500, 228 + xy: 600, 306 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 missiles-equip rotate: false - xy: 500, 228 + xy: 600, 306 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 chain-blaster-equip rotate: false - xy: 514, 228 + xy: 614, 306 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 flakgun-equip rotate: false - xy: 113, 176 + xy: 648, 292 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 flamethrower-equip rotate: false - xy: 127, 176 + xy: 648, 278 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 heal-blaster-equip rotate: false - xy: 155, 176 + xy: 606, 264 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 shockgun-equip rotate: false - xy: 295, 180 + xy: 613, 236 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 swarmer-equip rotate: false - xy: 365, 180 + xy: 1006, 447 size: 12, 12 orig: 12, 12 offset: 0, 0 diff --git a/core/assets/sprites/sprites.png b/core/assets/sprites/sprites.png index f444aa0c93..83413e6262 100644 Binary files a/core/assets/sprites/sprites.png and b/core/assets/sprites/sprites.png differ diff --git a/core/assets/ui/uiskin.json b/core/assets/ui/uiskin.json index 0ec75e9725..6ca21b566a 100644 --- a/core/assets/ui/uiskin.json +++ b/core/assets/ui/uiskin.json @@ -24,7 +24,6 @@ ButtonStyle: { }, TextButtonStyle: { default: {over: button-over, disabled: button, font: default-font, fontColor: white, disabledFontColor: gray, down: button-down, up: button}, - left: {over: button-left-over, font: default-font, fontColor: white, disabledFontColor: gray, down: button-left-down, up: button-left}, right: {over: button-right-over, font: default-font, fontColor: white, disabledFontColor: gray, down: button-right-down, up: button-right}, wave: {font: default-font, fontColor: white, disabledFontColor: gray, up: button-edge-4}, clear: {over: flat-over, font: default-font, fontColor: white, disabledFontColor: gray, down: pane, up: flat}, @@ -33,6 +32,7 @@ TextButtonStyle: { clear-partial: {down: white, up: button-select, over: flat-down, font: default-font, fontColor: white, disabledFontColor: gray }, clear-partial-2: {down: flat-over, up: none, over: flat-over, font: default-font, fontColor: white, disabledFontColor: gray }, empty: {font: default-font}, + clear-toggle: {font: default-font, fontColor: white, checked: flat-down, down: flat-down, up: flat, over: flat-over, disabled: flat, disabledFontColor: gray } toggle: {font: default-font, fontColor: white, checked: button-down, down: button-down, up: button, over: button-over, disabled: button, disabledFontColor: gray } }, ImageButtonStyle: { diff --git a/core/src/io/anuke/mindustry/ai/BlockIndexer.java b/core/src/io/anuke/mindustry/ai/BlockIndexer.java index 9b0c5f7bac..8bc2d080d9 100644 --- a/core/src/io/anuke/mindustry/ai/BlockIndexer.java +++ b/core/src/io/anuke/mindustry/ai/BlockIndexer.java @@ -51,8 +51,8 @@ public class BlockIndexer{ public BlockIndexer(){ Events.on(TileChangeEvent.class, event -> { - if(typeMap.get(event.tile.packedPosition()) != null){ - TileIndex index = typeMap.get(event.tile.packedPosition()); + if(typeMap.get(event.tile.pos()) != null){ + TileIndex index = typeMap.get(event.tile.pos()); for(BlockFlag flag : index.flags){ getFlagged(index.team)[flag.ordinal()].remove(event.tile); } @@ -86,7 +86,7 @@ public class BlockIndexer{ process(tile); - if(tile.entity != null && tile.entity.healthf() < 0.9999f){ + if(tile.entity != null && tile.entity.damaged()){ notifyTileDamaged(tile.entity); } } @@ -116,7 +116,7 @@ public class BlockIndexer{ ObjectSet set = damagedTiles[team.ordinal()]; for(Tile tile : set){ - if(tile.entity == null || tile.entity.getTeam() != team || tile.entity.healthf() >= 0.9999f){ + if(tile.entity == null || tile.entity.getTeam() != team || !tile.entity.damaged()){ returnArray.add(tile); } } @@ -230,7 +230,7 @@ public class BlockIndexer{ map[flag.ordinal()] = arr; } - typeMap.put(tile.packedPosition(), new TileIndex(tile.block().flags, tile.getTeam())); + typeMap.put(tile.pos(), new TileIndex(tile.block().flags, tile.getTeam())); } if(ores == null) return; diff --git a/core/src/io/anuke/mindustry/ai/WaveSpawner.java b/core/src/io/anuke/mindustry/ai/WaveSpawner.java index 44c39e1b59..897cdcda3f 100644 --- a/core/src/io/anuke/mindustry/ai/WaveSpawner.java +++ b/core/src/io/anuke/mindustry/ai/WaveSpawner.java @@ -10,9 +10,9 @@ import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Waves; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.Events; -import io.anuke.ucore.util.Structs; import io.anuke.ucore.util.GridBits; import io.anuke.ucore.util.Mathf; +import io.anuke.ucore.util.Structs; import java.io.DataInput; import java.io.DataOutput; @@ -21,7 +21,7 @@ import java.io.IOException; import static io.anuke.mindustry.Vars.*; public class WaveSpawner{ - private static final int quadsize = 4; + private static final int quadsize = 6; private GridBits quadrants; @@ -164,7 +164,7 @@ public class WaveSpawner{ for(int y = quady * quadsize; y < world.height() && y < (quady + 1) * quadsize; y++){ Tile tile = world.tile(x, y); - if(tile == null || tile.solid() || world.pathfinder.getValueforTeam(Team.red, x, y) == Float.MAX_VALUE){ + if(tile == null || tile.solid() || tile.getTeam() == defaultTeam || world.pathfinder.getValueforTeam(Team.red, x, y) == Float.MAX_VALUE || tile.floor().isLiquid){ setQuad(quadx, quady, false); break outer; } @@ -217,8 +217,8 @@ public class WaveSpawner{ //TODO instead of randomly scattering locations around the map, find spawns close to each other private void findLocation(GroundSpawn spawn){ - spawn.x = -1; - spawn.y = -1; + spawn.x = Mathf.random(quadWidth()-1); + spawn.y = Mathf.random(quadHeight()-1); int shellWidth = quadWidth() * 2 + quadHeight() * 2 * 6; shellWidth = Math.min(quadWidth() * quadHeight() / 4, shellWidth); diff --git a/core/src/io/anuke/mindustry/content/Items.java b/core/src/io/anuke/mindustry/content/Items.java index a19a2a4048..8c1d7064db 100644 --- a/core/src/io/anuke/mindustry/content/Items.java +++ b/core/src/io/anuke/mindustry/content/Items.java @@ -83,7 +83,7 @@ public class Items implements ContentList{ }}; biomatter = new Item("biomatter", Color.valueOf("648b55")){{ - flammability = 0.4f; + flammability = 0.55f; fluxiness = 0.3f; }}; diff --git a/core/src/io/anuke/mindustry/content/Liquids.java b/core/src/io/anuke/mindustry/content/Liquids.java index f2e8ec6c0f..fc8bb44bfb 100644 --- a/core/src/io/anuke/mindustry/content/Liquids.java +++ b/core/src/io/anuke/mindustry/content/Liquids.java @@ -26,7 +26,7 @@ public class Liquids implements ContentList{ lava = new Liquid("lava", Color.valueOf("e37341")){ { - temperature = 0.8f; + temperature = 1f; viscosity = 0.8f; tier = 2; effect = StatusEffects.melting; diff --git a/core/src/io/anuke/mindustry/content/Mechs.java b/core/src/io/anuke/mindustry/content/Mechs.java index 88fb7b6a9e..589ef08b95 100644 --- a/core/src/io/anuke/mindustry/content/Mechs.java +++ b/core/src/io/anuke/mindustry/content/Mechs.java @@ -123,6 +123,7 @@ public class Mechs implements ContentList{ speed = 0.44f; drag = 0.35f; boostSpeed = 0.8f; + canHeal = true; weapon = Weapons.healBlaster; armor = 15f; trailColorTo = Palette.heal; @@ -287,8 +288,8 @@ public class Mechs implements ContentList{ trident = new Mech("trident-ship", true){ { drillPower = 2; - speed = 0.12f; - drag = 0.035f; + speed = 0.14f; + drag = 0.034f; mass = 2.5f; turnCursor = false; armor = 20f; diff --git a/core/src/io/anuke/mindustry/content/Recipes.java b/core/src/io/anuke/mindustry/content/Recipes.java index fa35a71f1d..5442871716 100644 --- a/core/src/io/anuke/mindustry/content/Recipes.java +++ b/core/src/io/anuke/mindustry/content/Recipes.java @@ -42,17 +42,23 @@ public class Recipes implements ContentList{ new Recipe(defense, DefenseBlocks.surgeWall, new ItemStack(Items.surgealloy, 12)); new Recipe(defense, DefenseBlocks.surgeWallLarge, new ItemStack(Items.surgealloy, 12 * 4)); + new Recipe(effect, StorageBlocks.container, new ItemStack(Items.densealloy, 200)); + new Recipe(effect, StorageBlocks.vault, new ItemStack(Items.densealloy, 500), new ItemStack(Items.thorium, 250)); + + //core disabled due to being broken + new Recipe(effect, StorageBlocks.core, + new ItemStack(Items.copper, 2000), new ItemStack(Items.densealloy, 1500), + new ItemStack(Items.silicon, 1500), new ItemStack(Items.thorium, 500), + new ItemStack(Items.surgealloy, 500), new ItemStack(Items.phasefabric, 750) + ); + //projectors new Recipe(effect, DefenseBlocks.mendProjector, new ItemStack(Items.lead, 200), new ItemStack(Items.densealloy, 150), new ItemStack(Items.titanium, 50), new ItemStack(Items.silicon, 180)); new Recipe(effect, DefenseBlocks.overdriveProjector, new ItemStack(Items.lead, 200), new ItemStack(Items.densealloy, 150), new ItemStack(Items.titanium, 150), new ItemStack(Items.silicon, 250)); new Recipe(effect, DefenseBlocks.forceProjector, new ItemStack(Items.lead, 200), new ItemStack(Items.densealloy, 150), new ItemStack(Items.titanium, 150), new ItemStack(Items.silicon, 250)); - new Recipe(effect, StorageBlocks.unloader, new ItemStack(Items.densealloy, 50), new ItemStack(Items.silicon, 60)); - new Recipe(effect, StorageBlocks.container, new ItemStack(Items.densealloy, 200)); - new Recipe(effect, StorageBlocks.vault, new ItemStack(Items.densealloy, 500), new ItemStack(Items.thorium, 250)); - new Recipe(effect, DefenseBlocks.shockMine, new ItemStack(Items.lead, 50), new ItemStack(Items.silicon, 25)) - .setDependencies(Items.blastCompound); + .setDependencies(Items.blastCompound); //TURRETS new Recipe(turret, TurretBlocks.duo, new ItemStack(Items.copper, 40)).setAlwaysUnlocked(true); @@ -82,6 +88,7 @@ public class Recipes implements ContentList{ new Recipe(distribution, DistributionBlocks.sorter, new ItemStack(Items.densealloy, 4), new ItemStack(Items.copper, 4)); new Recipe(distribution, DistributionBlocks.overflowGate, new ItemStack(Items.densealloy, 4), new ItemStack(Items.copper, 8)); new Recipe(distribution, DistributionBlocks.itemBridge, new ItemStack(Items.densealloy, 8), new ItemStack(Items.copper, 8)); + new Recipe(distribution, StorageBlocks.unloader, new ItemStack(Items.densealloy, 50), new ItemStack(Items.silicon, 60)); new Recipe(distribution, DistributionBlocks.massDriver, new ItemStack(Items.densealloy, 250), new ItemStack(Items.silicon, 150), new ItemStack(Items.lead, 250), new ItemStack(Items.thorium, 100)); //CRAFTING @@ -133,13 +140,6 @@ public class Recipes implements ContentList{ new Recipe(power, PowerBlocks.thoriumReactor, new ItemStack(Items.lead, 600), new ItemStack(Items.silicon, 400), new ItemStack(Items.densealloy, 300), new ItemStack(Items.thorium, 300)); new Recipe(power, PowerBlocks.rtgGenerator, new ItemStack(Items.lead, 200), new ItemStack(Items.silicon, 150), new ItemStack(Items.phasefabric, 50), new ItemStack(Items.plastanium, 150), new ItemStack(Items.thorium, 100)); - //core disabled due to being broken - /*new Recipe(distribution, StorageBlocks.core, - new ItemStack(Items.copper, 2000), new ItemStack(Items.densealloy, 1500), - new ItemStack(Items.silicon, 1500), new ItemStack(Items.thorium, 500), - new ItemStack(Items.surgealloy, 500), new ItemStack(Items.phasefabric, 750) - );*/ - //DRILLS, PRODUCERS new Recipe(production, ProductionBlocks.mechanicalDrill, new ItemStack(Items.copper, 45)).setAlwaysUnlocked(true); new Recipe(production, ProductionBlocks.pneumaticDrill, new ItemStack(Items.copper, 60), new ItemStack(Items.densealloy, 50)); diff --git a/core/src/io/anuke/mindustry/content/StatusEffects.java b/core/src/io/anuke/mindustry/content/StatusEffects.java index a6e569e48f..62e1de504f 100644 --- a/core/src/io/anuke/mindustry/content/StatusEffects.java +++ b/core/src/io/anuke/mindustry/content/StatusEffects.java @@ -11,7 +11,7 @@ import io.anuke.ucore.core.Timers; import io.anuke.ucore.util.Mathf; public class StatusEffects implements ContentList{ - public static StatusEffect none, burning, freezing, wet, melting, tarred, overdrive, shielded; + public static StatusEffect none, burning, freezing, wet, melting, tarred, overdrive, shielded, shocked; @Override public void load(){ @@ -47,7 +47,8 @@ public class StatusEffects implements ContentList{ freezing = new StatusEffect(5 * 60f){ { oppositeScale = 0.4f; - speedMultiplier = 0.5f; + speedMultiplier = 0.6f; + armorMultiplier = 0.8f; } @Override @@ -65,6 +66,17 @@ public class StatusEffects implements ContentList{ speedMultiplier = 0.9f; } + @Override + public StatusEntry getTransition(Unit unit, StatusEffect to, float time, float newTime, StatusEntry result){ + if(to == shocked){ + //get shocked when wet + unit.damage(15f); + return result.set(this, time); + } + + return super.getTransition(unit, to, time, newTime, result); + } + @Override public void update(Unit unit, float time){ if(Mathf.chance(Timers.delta() * 0.15f)){ @@ -145,6 +157,13 @@ public class StatusEffects implements ContentList{ } }; + shocked = new StatusEffect(1f){ + { + armorMultiplier = 3f; + } + }; + + wet.setOpposites(shocked); melting.setOpposites(wet, freezing); wet.setOpposites(burning); freezing.setOpposites(burning, melting); diff --git a/core/src/io/anuke/mindustry/content/Weapons.java b/core/src/io/anuke/mindustry/content/Weapons.java index bc77a1e784..480c8988bf 100644 --- a/core/src/io/anuke/mindustry/content/Weapons.java +++ b/core/src/io/anuke/mindustry/content/Weapons.java @@ -152,7 +152,7 @@ public class Weapons implements ContentList{ bomberTrident = new Weapon("bomber"){{ length = 0f; width = 2f; - reload = 9f; + reload = 8f; shots = 2; roundrobin = true; ejectEffect = Fx.none; diff --git a/core/src/io/anuke/mindustry/content/blocks/CraftingBlocks.java b/core/src/io/anuke/mindustry/content/blocks/CraftingBlocks.java index bb8be99b03..e2c27f9c40 100644 --- a/core/src/io/anuke/mindustry/content/blocks/CraftingBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/CraftingBlocks.java @@ -185,9 +185,9 @@ public class CraftingBlocks extends BlockList implements ContentList{ biomatterCompressor = new Compressor("biomattercompressor"){{ liquidCapacity = 60f; itemCapacity = 50; - craftTime = 25f; + craftTime = 20f; outputLiquid = Liquids.oil; - outputLiquidAmount = 1.5f; + outputLiquidAmount = 2.5f; size = 2; health = 320; hasLiquids = true; diff --git a/core/src/io/anuke/mindustry/content/blocks/DebugBlocks.java b/core/src/io/anuke/mindustry/content/blocks/DebugBlocks.java index 9d6c8e1afc..53ac78afb1 100644 --- a/core/src/io/anuke/mindustry/content/blocks/DebugBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/DebugBlocks.java @@ -92,8 +92,11 @@ public class DebugBlocks extends BlockList implements ContentList{ @Override public void update(Tile tile){ SorterEntity entity = tile.entity(); + if(entity.sortItem == null) return; + entity.items.set(entity.sortItem, 1); tryDump(tile, entity.sortItem); + entity.items.set(entity.sortItem, 0); } @Override diff --git a/core/src/io/anuke/mindustry/content/blocks/LiquidBlocks.java b/core/src/io/anuke/mindustry/content/blocks/LiquidBlocks.java index 3ca87efef1..e4eb6ff040 100644 --- a/core/src/io/anuke/mindustry/content/blocks/LiquidBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/LiquidBlocks.java @@ -50,10 +50,10 @@ public class LiquidBlocks extends BlockList implements ContentList{ }}; liquidRouter = new LiquidRouter("liquid-router"){{ - liquidCapacity = 40f; + liquidCapacity = 20f; }}; - liquidtank = new LiquidRouter("liquid-tank"){{ + liquidtank = new LiquidTank("liquid-tank"){{ size = 3; liquidCapacity = 1500f; health = 500; diff --git a/core/src/io/anuke/mindustry/content/blocks/PowerBlocks.java b/core/src/io/anuke/mindustry/content/blocks/PowerBlocks.java index 9e3df7f685..1101a106e8 100644 --- a/core/src/io/anuke/mindustry/content/blocks/PowerBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/PowerBlocks.java @@ -21,7 +21,7 @@ public class PowerBlocks extends BlockList implements ContentList{ thermalGenerator = new LiquidHeatGenerator("thermal-generator"){{ maxLiquidGenerate = 2f; powerCapacity = 40f; - powerPerLiquid = 0.3f; + powerPerLiquid = 0.35f; generateEffect = BlockFx.redgeneratespark; size = 2; }}; diff --git a/core/src/io/anuke/mindustry/content/blocks/ProductionBlocks.java b/core/src/io/anuke/mindustry/content/blocks/ProductionBlocks.java index 8bd571620b..389cb425c7 100644 --- a/core/src/io/anuke/mindustry/content/blocks/ProductionBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/ProductionBlocks.java @@ -99,13 +99,13 @@ public class ProductionBlocks extends BlockList implements ContentList{ cultivator = new Cultivator("cultivator"){{ result = Items.biomatter; - drillTime = 260; + drillTime = 200; size = 2; hasLiquids = true; hasPower = true; consumes.power(0.08f); - consumes.liquid(Liquids.water, 0.2f); + consumes.liquid(Liquids.water, 0.15f); }}; } diff --git a/core/src/io/anuke/mindustry/content/blocks/StorageBlocks.java b/core/src/io/anuke/mindustry/content/blocks/StorageBlocks.java index 460a79da77..9972317a99 100644 --- a/core/src/io/anuke/mindustry/content/blocks/StorageBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/StorageBlocks.java @@ -13,20 +13,21 @@ public class StorageBlocks extends BlockList implements ContentList{ public void load(){ core = new CoreBlock("core"){{ health = 1100; + itemCapacity = 3000; }}; vault = new Vault("vault"){{ size = 3; - itemCapacity = 900; + itemCapacity = 1000; }}; container = new Vault("container"){{ size = 2; - itemCapacity = 200; + itemCapacity = 300; }}; unloader = new SortedUnloader("unloader"){{ - speed = 12f; + speed = 7f; }}; } } diff --git a/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java b/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java index a3a805a557..9569fd7826 100644 --- a/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java @@ -69,7 +69,7 @@ public class TurretBlocks extends BlockList implements ContentList{ inaccuracy = 5f; shootCone = 50f; shootEffect = ShootFx.shootLiquid; - range = 70f; + range = 90f; health = 360; drawer = (tile, entity) -> { diff --git a/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java b/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java index 2b28ec0016..1ec5252b02 100644 --- a/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java +++ b/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java @@ -39,6 +39,8 @@ public class TurretBullets extends BulletList implements ContentList{ lifetime = Lightning.lifetime; hiteffect = BulletFx.hitLancer; despawneffect = Fx.none; + status = StatusEffects.shocked; + statusIntensity = 1f; } }; @@ -71,7 +73,7 @@ public class TurretBullets extends BulletList implements ContentList{ super.hit(b); tile = tile.target(); - if(tile.getTeam() == b.getTeam() && !(tile.block() instanceof BuildBlock)){ + if(tile != null && tile.getTeam() == b.getTeam() && !(tile.block() instanceof BuildBlock)){ Effects.effect(BlockFx.healBlockFull, Palette.heal, tile.drawx(), tile.drawy(), tile.block().size); tile.entity.healBy(healPercent / 100f * tile.entity.maxHealth()); } @@ -332,7 +334,7 @@ public class TurretBullets extends BulletList implements ContentList{ lifetime = 200f; despawneffect = BlockFx.smeltsmoke; hiteffect = BulletFx.hitBulletBig; - drag = 0.01f; + drag = 0.005f; } @Override diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index 84991cacce..415f58b87c 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -26,7 +26,10 @@ import io.anuke.mindustry.ui.dialogs.FloatingDialog; import io.anuke.ucore.core.*; import io.anuke.ucore.entities.EntityQuery; import io.anuke.ucore.modules.Module; -import io.anuke.ucore.util.*; +import io.anuke.ucore.util.Atlas; +import io.anuke.ucore.util.Bundles; +import io.anuke.ucore.util.Strings; +import io.anuke.ucore.util.Timer; import java.io.IOException; @@ -372,7 +375,7 @@ public class Control extends Module{ } } - if(Inputs.keyTap("screenshot")){ + if(!mobile && Inputs.keyTap("screenshot") && !ui.chatfrag.chatOpen()){ renderer.takeMapScreenshot(); } diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index 052e31bc8f..a88ea19301 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -79,7 +79,9 @@ public class NetServer extends Module{ public NetServer(){ Events.on(WorldLoadEvent.class, event -> { - connections.clear(); + if(!headless){ + connections.clear(); + } }); Net.handleServer(Connect.class, (id, connect) -> { @@ -125,7 +127,7 @@ public class NetServer extends Module{ return; } - if(packet.versionType == null || ((packet.version == -1 || !packet.versionType.equals("official")) && Version.build != -1 && !admins.allowsCustomClients())){ + if(packet.versionType == null || ((packet.version == -1 || !packet.versionType.equals(Version.type)) && Version.build != -1 && !admins.allowsCustomClients())){ kick(id, KickReason.customClient); return; } @@ -279,6 +281,7 @@ public class NetServer extends Module{ } player.remove(); netServer.connections.remove(player.con.id); + Log.info("&lc{0} has disconnected.", player.name); } private static float compound(float speed, float drag){ @@ -379,7 +382,7 @@ public class NetServer extends Module{ return; } - if(other == null || (other.isAdmin && other != player)){ //fun fact: this means you can ban yourself + if(other == null || ((other.isAdmin && !player.isLocal) && other != player)){ Log.err("{0} attempted to perform admin action on nonexistant or admin player.", player.name); return; } @@ -490,7 +493,7 @@ public class NetServer extends Module{ //write all core inventory data for(Tile tile : cores){ - dataStream.writeInt(tile.packedPosition()); + dataStream.writeInt(tile.pos()); tile.entity.items.write(dataStream); } @@ -596,14 +599,18 @@ public class NetServer extends Module{ } void sync(){ + try{ //iterate through each player - for(Player player : connections.values()){ + for(int i = 0; i < playerGroup.size(); i ++){ + Player player = playerGroup.all().get(i); + if(player.isLocal) continue; + NetConnection connection = player.con; - if(!connection.isConnected()){ - //player disconnected, ignore them + if(!connection.isConnected() || !connections.containsKey(connection.id)){ + //player disconnected, call d/c event onDisconnect(player); return; } diff --git a/core/src/io/anuke/mindustry/core/Platform.java b/core/src/io/anuke/mindustry/core/Platform.java index 6c184cca81..0064c066c3 100644 --- a/core/src/io/anuke/mindustry/core/Platform.java +++ b/core/src/io/anuke/mindustry/core/Platform.java @@ -32,9 +32,22 @@ public abstract class Platform { dialog.setFillParent(true); dialog.content().top(); dialog.content().defaults().height(65f); + + TextField[] use = {null}; + + dialog.content().addImageButton("icon-copy", "clear", 16*3, () -> use[0].copy()) + .visible(() -> !use[0].getSelection().isEmpty()).width(65f); + + dialog.content().addImageButton("icon-paste", "clear", 16*3, () -> + use[0].paste(Gdx.app.getClipboard().getContents(), false)) + .visible(() -> Gdx.app.getClipboard() != null && Gdx.app.getClipboard().getContents() != null && !Gdx.app.getClipboard().getContents().isEmpty()).width(65f); + TextField to = dialog.content().addField(field.getText(), t-> {}).pad(15).width(250f).get(); to.setMaxLength(maxLength); to.keyDown(Keys.ENTER, () -> dialog.content().find("okb").fireClick()); + + use[0] = to; + dialog.content().addButton("$text.ok", () -> { field.clearText(); field.appendText(to.getText()); diff --git a/core/src/io/anuke/mindustry/core/Renderer.java b/core/src/io/anuke/mindustry/core/Renderer.java index efc8b0a500..df097fc0f9 100644 --- a/core/src/io/anuke/mindustry/core/Renderer.java +++ b/core/src/io/anuke/mindustry/core/Renderer.java @@ -152,7 +152,7 @@ public class Renderer extends RendererModule{ if(players[0].isDead()){ TileEntity core = players[0].getClosestCore(); - if(core != null && players[0].spawner == -1){ + if(core != null && players[0].spawner == Unit.noSpawner){ smoothCamera(core.x, core.y, 0.08f); }else{ smoothCamera(position.x + 0.0001f, position.y + 0.0001f, 0.08f); @@ -395,8 +395,8 @@ public class Renderer extends RendererModule{ Graphics.getEffectSurface().setSize(w, h, true); Core.camera.viewportWidth = w; Core.camera.viewportHeight = h; - Core.camera.position.x = w/2f; - Core.camera.position.y = h/2f; + Core.camera.position.x = w/2f + tilesize/2f; + Core.camera.position.y = h/2f + tilesize/2f; draw(); diff --git a/core/src/io/anuke/mindustry/core/World.java b/core/src/io/anuke/mindustry/core/World.java index cf72719411..58dedd6e2a 100644 --- a/core/src/io/anuke/mindustry/core/World.java +++ b/core/src/io/anuke/mindustry/core/World.java @@ -15,6 +15,7 @@ import io.anuke.mindustry.io.MapIO; import io.anuke.mindustry.maps.*; import io.anuke.mindustry.maps.generation.WorldGenerator; import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.Pos; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.OreBlock; import io.anuke.ucore.core.Events; @@ -30,8 +31,8 @@ public class World extends Module{ public final Sectors sectors = new Sectors(); public final WorldGenerator generator = new WorldGenerator(); public final BlockIndexer indexer = new BlockIndexer(); - public final Pathfinder pathfinder = new Pathfinder(); public final WaveSpawner spawner = new WaveSpawner(); + public final Pathfinder pathfinder = new Pathfinder(); private Map currentMap; private Sector currentSector; @@ -103,12 +104,8 @@ public class World extends Module{ return tiles == null ? 0 : tiles[0].length; } - public int toPacked(int x, int y){ - return x + y * width(); - } - - public Tile tile(int packed){ - return tiles == null ? null : tile(packed % width(), packed / width()); + public Tile tile(int pos){ + return tiles == null ? null : tile(Pos.x(pos), Pos.y(pos)); } public Tile tile(int x, int y){ diff --git a/core/src/io/anuke/mindustry/editor/MapEditorDialog.java b/core/src/io/anuke/mindustry/editor/MapEditorDialog.java index 12a75b9496..90d18ac61e 100644 --- a/core/src/io/anuke/mindustry/editor/MapEditorDialog.java +++ b/core/src/io/anuke/mindustry/editor/MapEditorDialog.java @@ -567,16 +567,16 @@ public class MapEditorDialog extends Dialog implements Disposable{ button.getImage().remove(); button.update(() -> button.setChecked(editor.getDrawBlock() == block)); group.add(button); - content.add(button).size(60f); + content.add(button).size(50f); - if(i++ % 3 == 2){ + if(++i % 4 == 0){ content.row(); } } group.getButtons().get(2).setChecked(true); - table.table("underline", extra -> extra.labelWrap(() -> editor.getDrawBlock().formalName).width(220f).center()).growX(); + table.table("underline", extra -> extra.labelWrap(() -> editor.getDrawBlock().formalName).width(200f).center()).growX(); table.row(); table.add(pane).growY().fillX(); } diff --git a/core/src/io/anuke/mindustry/entities/Player.java b/core/src/io/anuke/mindustry/entities/Player.java index a83bfcc18f..c4708c9951 100644 --- a/core/src/io/anuke/mindustry/entities/Player.java +++ b/core/src/io/anuke/mindustry/entities/Player.java @@ -58,7 +58,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra public boolean achievedFlight; public Color color = new Color(); public Mech mech; - public int spawner = -1; + public int spawner = noSpawner; public NetConnection con; public int playerIndex = 0; @@ -498,7 +498,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra updateRespawning(); return; }else{ - spawner = -1; + spawner = noSpawner; } avoidOthers(1f); @@ -645,7 +645,8 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra } protected void updateFlying(){ - if(Units.invalidateTarget(target, this)){ + if(Units.invalidateTarget(target, this) && !(target instanceof TileEntity && ((TileEntity) target).damaged() && target.getTeam() == team && + mech.canHeal && distanceTo(target) < getWeapon().getAmmo().getRange())){ target = null; } @@ -726,11 +727,22 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra isShooting = false; if(Settings.getBool("autotarget")){ target = Units.getClosestTarget(team, x, y, getWeapon().getAmmo().getRange()); + + if(mech.canHeal && target == null){ + target = Geometry.findClosest(x, y, world.indexer.getDamaged(Team.blue)); + if(target != null && distanceTo(target) > getWeapon().getAmmo().getRange()){ + target = null; + }else if(target != null){ + target = ((Tile)target).entity; + } + } + if(target != null){ setMineTile(null); } } - }else if(target.isValid()){ + }else if(target.isValid() || (target instanceof TileEntity && ((TileEntity) target).damaged() && target.getTeam() == team && + mech.canHeal && distanceTo(target) < getWeapon().getAmmo().getRange())){ //rotate toward and shoot the target if(mech.turnCursor){ rotation = Mathf.slerpDelta(rotation, angleTo(target), 0.2f); @@ -788,23 +800,23 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra public void updateRespawning(){ - if(spawner != -1 && world.tile(spawner) != null && world.tile(spawner).entity instanceof SpawnerTrait){ + if(spawner != noSpawner && world.tile(spawner) != null && world.tile(spawner).entity instanceof SpawnerTrait){ ((SpawnerTrait) world.tile(spawner).entity).updateSpawning(this); }else{ CoreEntity entity = (CoreEntity) getClosestCore(); if(entity != null && !netServer.isWaitingForPlayers()){ - this.spawner = entity.tile.id(); + this.spawner = entity.tile.pos(); } } } public void beginRespawning(SpawnerTrait spawner){ - this.spawner = spawner.getTile().packedPosition(); + this.spawner = spawner.getTile().pos(); this.dead = true; } public void endRespawning(){ - spawner = -1; + spawner = noSpawner; } //endregion @@ -860,7 +872,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra buffer.writeByte(Bits.toByte(isAdmin) | (Bits.toByte(dead) << 1) | (Bits.toByte(isBoosting) << 2)); buffer.writeInt(Color.rgba8888(color)); buffer.writeByte(mech.id); - buffer.writeInt(mining == null ? -1 : mining.packedPosition()); + buffer.writeInt(mining == null ? -1 : mining.pos()); buffer.writeInt(spawner); buffer.writeShort((short) (baseRotation * 2)); diff --git a/core/src/io/anuke/mindustry/entities/TileEntity.java b/core/src/io/anuke/mindustry/entities/TileEntity.java index 10aec5f47b..7df1e6d659 100644 --- a/core/src/io/anuke/mindustry/entities/TileEntity.java +++ b/core/src/io/anuke/mindustry/entities/TileEntity.java @@ -154,6 +154,10 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{ } } + public boolean damaged(){ + return health < maxHealth() - 0.00001f; + } + public Tile getTile(){ return tile; } diff --git a/core/src/io/anuke/mindustry/entities/Unit.java b/core/src/io/anuke/mindustry/entities/Unit.java index ef6bdfecfe..198d44b283 100644 --- a/core/src/io/anuke/mindustry/entities/Unit.java +++ b/core/src/io/anuke/mindustry/entities/Unit.java @@ -12,6 +12,7 @@ import io.anuke.mindustry.net.Interpolator; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.type.StatusEffect; import io.anuke.mindustry.type.Weapon; +import io.anuke.mindustry.world.Pos; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.Floor; import io.anuke.ucore.core.Effects; @@ -39,6 +40,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ public static final float velocityPercision = 8f; /**Maximum absolute value of a velocity vector component.*/ public static final float maxAbsVelocity = 127f / velocityPercision; + public static final int noSpawner = Pos.get(-1, 1); private static final Rectangle queryRect = new Rectangle(); private static final Vector2 moveVector = new Vector2(); diff --git a/core/src/io/anuke/mindustry/entities/effect/Fire.java b/core/src/io/anuke/mindustry/entities/effect/Fire.java index e6581a41ed..bf6e58c698 100644 --- a/core/src/io/anuke/mindustry/entities/effect/Fire.java +++ b/core/src/io/anuke/mindustry/entities/effect/Fire.java @@ -48,7 +48,7 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait, Poolable{ public static void create(Tile tile){ if(Net.client() || tile == null) return; //not clientside. - Fire fire = map.get(tile.packedPosition()); + Fire fire = map.get(tile.pos()); if(fire == null){ fire = Pooling.obtain(Fire.class, Fire::new); @@ -56,7 +56,7 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait, Poolable{ fire.lifetime = baseLifetime; fire.set(tile.worldx(), tile.worldy()); fire.add(); - map.put(tile.packedPosition(), fire); + map.put(tile.pos(), fire); }else{ fire.lifetime = baseLifetime; fire.time = 0f; @@ -75,8 +75,8 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait, Poolable{ * Attempts to extinguish a fire by shortening its life. If there is no fire here, does nothing. */ public static void extinguish(Tile tile, float intensity){ - if(tile != null && map.containsKey(tile.packedPosition())){ - map.get(tile.packedPosition()).time += intensity * Timers.delta(); + if(tile != null && map.containsKey(tile.pos())){ + map.get(tile.pos()).time += intensity * Timers.delta(); } } @@ -157,7 +157,7 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait, Poolable{ @Override public void writeSave(DataOutput stream) throws IOException{ - stream.writeInt(tile.packedPosition()); + stream.writeInt(tile.pos()); stream.writeFloat(lifetime); stream.writeFloat(time); } @@ -202,7 +202,7 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait, Poolable{ @Override public void removed(){ if(tile != null){ - map.remove(tile.packedPosition()); + map.remove(tile.pos()); } reset(); } diff --git a/core/src/io/anuke/mindustry/entities/effect/GroundEffectEntity.java b/core/src/io/anuke/mindustry/entities/effect/GroundEffectEntity.java index 889c04a7ce..ceaceb8ba7 100644 --- a/core/src/io/anuke/mindustry/entities/effect/GroundEffectEntity.java +++ b/core/src/io/anuke/mindustry/entities/effect/GroundEffectEntity.java @@ -6,7 +6,7 @@ import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.core.Timers; import io.anuke.ucore.entities.impl.EffectEntity; -import io.anuke.ucore.function.EffectRenderer; +import io.anuke.ucore.core.Effects.EffectRenderer; import io.anuke.ucore.util.Mathf; /** diff --git a/core/src/io/anuke/mindustry/entities/effect/Lightning.java b/core/src/io/anuke/mindustry/entities/effect/Lightning.java index d6ccaaf50f..1cf162f286 100644 --- a/core/src/io/anuke/mindustry/entities/effect/Lightning.java +++ b/core/src/io/anuke/mindustry/entities/effect/Lightning.java @@ -91,7 +91,6 @@ public class Lightning extends TimedEntity implements DrawTrait, SyncTrait, Time x += Angles.trnsx(rotation, hitRange/2f); y += Angles.trnsy(rotation, hitRange/2f); } - } } diff --git a/core/src/io/anuke/mindustry/entities/effect/Puddle.java b/core/src/io/anuke/mindustry/entities/effect/Puddle.java index f521f1568c..ce9dfc4926 100644 --- a/core/src/io/anuke/mindustry/entities/effect/Puddle.java +++ b/core/src/io/anuke/mindustry/entities/effect/Puddle.java @@ -73,7 +73,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai /**Returns the puddle on the specified tile. May return null.*/ public static Puddle getPuddle(Tile tile){ - return map.get(tile.packedPosition()); + return map.get(tile.pos()); } private static void deposit(Tile tile, Tile source, Liquid liquid, float amount, int generation){ @@ -83,7 +83,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai reactPuddle(tile.floor().liquidDrop, liquid, amount, tile, (tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f); - Puddle p = map.get(tile.packedPosition()); + Puddle p = map.get(tile.pos()); if(generation == 0 && p != null && p.lastRipple <= Timers.time() - 40f){ Effects.effect(BlockFx.ripple, tile.floor().liquidDrop.color, @@ -93,7 +93,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai return; } - Puddle p = map.get(tile.packedPosition()); + Puddle p = map.get(tile.pos()); if(p == null){ if(Net.client()) return; //not clientside. @@ -104,7 +104,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai puddle.generation = (byte) generation; puddle.set((tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f); puddle.add(); - map.put(tile.packedPosition(), puddle); + map.put(tile.pos(), puddle); }else if(p.liquid == liquid){ p.accepting = Math.max(amount, p.accepting); @@ -249,7 +249,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai @Override public void writeSave(DataOutput stream) throws IOException{ - stream.writeInt(tile.packedPosition()); + stream.writeInt(tile.pos()); stream.writeFloat(x); stream.writeFloat(y); stream.writeByte(liquid.id); @@ -288,7 +288,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai @Override public void removed(){ - map.remove(tile.packedPosition()); + map.remove(tile.pos()); reset(); } @@ -298,7 +298,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai data.writeFloat(y); data.writeByte(liquid.id); data.writeShort((short) (amount * 4)); - data.writeInt(tile.packedPosition()); + data.writeInt(tile.pos()); } @Override @@ -309,7 +309,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai targetAmount = data.readShort() / 4f; tile = world.tile(data.readInt()); - map.put(tile.packedPosition(), this); + map.put(tile.pos(), this); } @Override diff --git a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java index 4cd9cf0f0f..8e021d53d7 100644 --- a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java +++ b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java @@ -16,6 +16,7 @@ import io.anuke.mindustry.net.Net; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Recipe; import io.anuke.mindustry.world.Build; +import io.anuke.mindustry.world.Pos; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.BuildBlock; import io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity; @@ -27,7 +28,10 @@ import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Fill; import io.anuke.ucore.graphics.Lines; import io.anuke.ucore.graphics.Shapes; -import io.anuke.ucore.util.*; +import io.anuke.ucore.util.Angles; +import io.anuke.ucore.util.Geometry; +import io.anuke.ucore.util.Mathf; +import io.anuke.ucore.util.Translator; import java.io.DataInput; import java.io.DataOutput; @@ -72,7 +76,7 @@ public interface BuilderTrait extends Entity{ if(request != null){ output.writeByte(request.breaking ? 1 : 0); - output.writeInt(world.toPacked(request.x, request.y)); + output.writeInt(Pos.get(request.x, request.y)); output.writeFloat(request.progress); if(!request.breaking){ output.writeByte(request.recipe.id); @@ -96,13 +100,13 @@ public interface BuilderTrait extends Entity{ float progress = input.readFloat(); BuildRequest request; - if(type == 1){ //remove - request = new BuildRequest(position % world.width(), position / world.width()); - }else{ //place - byte recipe = input.readByte(); - byte rotation = input.readByte(); - request = new BuildRequest(position % world.width(), position / world.width(), rotation, content.recipe(recipe)); - } + if(type == 1){ //remove + request = new BuildRequest(Pos.x(position), Pos.y(position)); + }else{ //place + byte recipe = input.readByte(); + byte rotation = input.readByte(); + request = new BuildRequest(Pos.x(position), Pos.y(position), rotation, content.recipe(recipe)); + } request.progress = progress; diff --git a/core/src/io/anuke/mindustry/entities/units/BaseUnit.java b/core/src/io/anuke/mindustry/entities/units/BaseUnit.java index c36a07bc5a..66f34c5bdc 100644 --- a/core/src/io/anuke/mindustry/entities/units/BaseUnit.java +++ b/core/src/io/anuke/mindustry/entities/units/BaseUnit.java @@ -52,7 +52,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ protected boolean isWave; protected Squad squad; - protected int spawner = -1; + protected int spawner = noSpawner; /**internal constructor used for deserialization, DO NOT USE*/ public BaseUnit(){ @@ -111,16 +111,8 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ return type; } - public Tile getSpawner(){ - return world.tile(spawner); - } - public void setSpawner(Tile tile){ - this.spawner = tile.packedPosition(); - } - - public void setIntSpawner(int pos){ - this.spawner = pos; + this.spawner = tile.pos(); } /**Sets this to a 'wave' unit, which means it has slightly different AI and will not run out of ammo.*/ @@ -143,7 +135,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ } public void updateRespawning(){ - if(spawner == -1) return; + if(spawner == noSpawner) return; Tile tile = world.tile(spawner); if(tile != null && tile.entity != null){ @@ -151,7 +143,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ ((SpawnerTrait) tile.entity).updateSpawning(this); } }else{ - spawner = -1; + spawner = noSpawner; } } @@ -305,7 +297,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ avoidOthers(1.25f); - if(spawner != -1 && (world.tile(spawner) == null || world.tile(spawner).entity == null)){ + if(spawner != noSpawner && (world.tile(spawner) == null || world.tile(spawner).entity == null)){ damage(health); } @@ -336,7 +328,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ @Override public void removed(){ - spawner = -1; + spawner = noSpawner; } @Override diff --git a/core/src/io/anuke/mindustry/entities/units/types/Drone.java b/core/src/io/anuke/mindustry/entities/units/types/Drone.java index 477f640965..b0adfeb4d5 100644 --- a/core/src/io/anuke/mindustry/entities/units/types/Drone.java +++ b/core/src/io/anuke/mindustry/entities/units/types/Drone.java @@ -358,8 +358,8 @@ public class Drone extends FlyingUnit implements BuilderTrait{ @Override public void write(DataOutput data) throws IOException{ super.write(data); - data.writeInt(mineTile == null || !state.is(mine) ? -1 : mineTile.packedPosition()); - data.writeInt(state.is(repair) && target instanceof TileEntity ? ((TileEntity)target).tile.packedPosition() : -1); + data.writeInt(mineTile == null || !state.is(mine) ? -1 : mineTile.pos()); + data.writeInt(state.is(repair) && target instanceof TileEntity ? ((TileEntity)target).tile.pos() : -1); writeBuilding(data); } diff --git a/core/src/io/anuke/mindustry/game/EventType.java b/core/src/io/anuke/mindustry/game/EventType.java index f2e91965f9..0724be398a 100644 --- a/core/src/io/anuke/mindustry/game/EventType.java +++ b/core/src/io/anuke/mindustry/game/EventType.java @@ -3,7 +3,7 @@ package io.anuke.mindustry.game; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.entities.traits.BuilderTrait; import io.anuke.mindustry.world.Tile; -import io.anuke.ucore.function.Event; +import io.anuke.ucore.core.Events.Event; public class EventType{ diff --git a/core/src/io/anuke/mindustry/game/GameMode.java b/core/src/io/anuke/mindustry/game/GameMode.java index 6d14023da8..cd4057012a 100644 --- a/core/src/io/anuke/mindustry/game/GameMode.java +++ b/core/src/io/anuke/mindustry/game/GameMode.java @@ -11,9 +11,8 @@ public enum GameMode{ freebuild{{ disableWaveTimer = true; }}, - noWaves{{ + attack{{ disableWaves = true; - hidden = true; enemyCheat = true; }}, victory{{ diff --git a/core/src/io/anuke/mindustry/game/Saves.java b/core/src/io/anuke/mindustry/game/Saves.java index 3947d578cd..0a2f2fcf28 100644 --- a/core/src/io/anuke/mindustry/game/Saves.java +++ b/core/src/io/anuke/mindustry/game/Saves.java @@ -127,6 +127,7 @@ public class Saves{ saveMap.put(slot.index, slot); slot.meta = SaveIO.getData(slot.index); current = slot; + slot.meta.sector = invalidSector; saveSlots(); return slot; } @@ -164,26 +165,17 @@ public class Saves{ public void save(){ long time = totalPlaytime; + renderer.fog.writeFog(); + long prev = totalPlaytime; + totalPlaytime = time; - threads.runGraphics(() -> { - //Renderer fog needs to be written on graphics thread, but save() can run on logic thread - //thus, runGraphics is required here - renderer.fog.writeFog(); + SaveIO.saveToSlot(index); + meta = SaveIO.getData(index); + if(!state.is(State.menu)){ + current = this; + } - //save on the logic thread - threads.run(() -> { - long prev = totalPlaytime; - totalPlaytime = time; - - SaveIO.saveToSlot(index); - meta = SaveIO.getData(index); - if(!state.is(State.menu)){ - current = this; - } - - totalPlaytime = prev; - }); - }); + totalPlaytime = prev; } public boolean isHidden(){ diff --git a/core/src/io/anuke/mindustry/game/Unlocks.java b/core/src/io/anuke/mindustry/game/Unlocks.java index ff2853f59b..7b624263b9 100644 --- a/core/src/io/anuke/mindustry/game/Unlocks.java +++ b/core/src/io/anuke/mindustry/game/Unlocks.java @@ -1,8 +1,6 @@ package io.anuke.mindustry.game; -import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.ObjectMap; -import com.badlogic.gdx.utils.ObjectMap.Entry; import com.badlogic.gdx.utils.ObjectSet; import io.anuke.mindustry.game.EventType.UnlockEvent; import io.anuke.mindustry.type.ContentType; @@ -67,27 +65,8 @@ public class Unlocks{ save(); } - /**Loads 'legacy' unlocks. Will be removed in final release.*/ - public void tryLoadLegacy(){ - try{ - ObjectMap>> sets = Settings.getObject("content-sets", ObjectMap.class, ObjectMap::new); - for(Entry> entry : sets.get("root").entries()){ - unlocked.put(entry.key, new ObjectSet<>()); - unlocked.get(entry.key).addAll(entry.value); - } - }catch(Throwable t){ - t.printStackTrace(); - } - Settings.prefs().remove("content-sets"); - Settings.save(); - } - public void load(){ unlocked = Settings.getObject("unlockset", ObjectMap.class, ObjectMap::new); - - if(Settings.has("content-sets")){ - tryLoadLegacy(); - } } public void save(){ diff --git a/core/src/io/anuke/mindustry/game/Waves.java b/core/src/io/anuke/mindustry/game/Waves.java index 4da4c37701..12fe04c959 100644 --- a/core/src/io/anuke/mindustry/game/Waves.java +++ b/core/src/io/anuke/mindustry/game/Waves.java @@ -96,6 +96,14 @@ public class Waves{ max = 10; }}, + new SpawnGroup(UnitTypes.fortress){{ + begin = 40; + spacing = 5; + unitAmount = 2; + unitScaling = 3; + max = 10; + }}, + new SpawnGroup(UnitTypes.dagger){{ begin = 35; spacing = 3; @@ -134,6 +142,15 @@ public class Waves{ max = 8; }}, + new SpawnGroup(UnitTypes.revenant){{ + begin = 50; + unitAmount = 4; + unitScaling = 3; + spacing = 5; + groupAmount = 2; + max = 8; + }}, + new SpawnGroup(UnitTypes.ghoul){{ begin = 53; unitAmount = 2; diff --git a/core/src/io/anuke/mindustry/graphics/FogRenderer.java b/core/src/io/anuke/mindustry/graphics/FogRenderer.java index 98857f1db0..7c920c78b0 100644 --- a/core/src/io/anuke/mindustry/graphics/FogRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/FogRenderer.java @@ -77,9 +77,11 @@ public class FogRenderer implements Disposable{ pixelBuffer.position(0); for(int i = 0; i < world.width() * world.height(); i++){ + int x = i % world.width(); + int y = i / world.width(); byte r = pixelBuffer.get(); if(r != 0){ - world.tile(i).setVisibility((byte)1); + world.tile(x, y).setVisibility((byte)1); } pixelBuffer.position(pixelBuffer.position() + 3); } @@ -128,10 +130,12 @@ public class FogRenderer implements Disposable{ changeQueue.clear(); if(dirty){ - for(int i = 0; i < world.width() * world.height(); i++){ - Tile tile = world.tile(i); - if(tile.discovered()){ - Fill.rect(tile.worldx(), tile.worldy(), tilesize, tilesize); + for(int x = 0; x < world.width(); x++){ + for(int y = 0; y < world.height(); y++){ + Tile tile = world.tile(x, y); + if(tile.discovered()){ + Fill.rect(tile.worldx(), tile.worldy(), tilesize, tilesize); + } } } dirty = false; diff --git a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java b/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java index c1ece11c93..3c070132fa 100644 --- a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java @@ -200,9 +200,10 @@ public class OverlayRenderer{ } void drawBar(Color color, float x, float y, float finion){ + if(finion > 0.9f) finion = 1f; //fixes precision errors finion = Mathf.clamp(finion); - if(finion > 0) finion = Mathf.clamp(finion + 0.2f, 0.24f, 1f); + if(finion > 0.001f) finion = Mathf.clamp(finion, 0.24f, 1f); float len = 3; diff --git a/core/src/io/anuke/mindustry/input/InputHandler.java b/core/src/io/anuke/mindustry/input/InputHandler.java index 111b2f9718..ac8007737c 100644 --- a/core/src/io/anuke/mindustry/input/InputHandler.java +++ b/core/src/io/anuke/mindustry/input/InputHandler.java @@ -95,7 +95,7 @@ public abstract class InputHandler extends InputAdapter{ ItemTransfer.create(item, player.x + Angles.trnsx(player.rotation + 180f, backTrns), player.y + Angles.trnsy(player.rotation + 180f, backTrns), new Translator(tile.drawx() + stackTrns.x, tile.drawy() + stackTrns.y), () -> { - if(tile.block() != block || tile.entity == null) return; + if(tile.block() != block || tile.entity == null || tile.entity.items == null) return; tile.block().handleStack(item, removed, tile, player); remaining[1] -= removed; diff --git a/core/src/io/anuke/mindustry/input/MobileInput.java b/core/src/io/anuke/mindustry/input/MobileInput.java index dba880f8c0..f4272a40cb 100644 --- a/core/src/io/anuke/mindustry/input/MobileInput.java +++ b/core/src/io/anuke/mindustry/input/MobileInput.java @@ -96,6 +96,9 @@ public class MobileInput extends InputHandler implements GestureListener{ TileEntity entity = tile.entity; player.setMineTile(null); player.target = entity; + }else if(tile != null && player.mech.canHeal && tile.entity != null && tile.getTeam() == player.getTeam() && tile.entity.damaged()){ + player.setMineTile(null); + player.target = tile.entity; } } } @@ -221,11 +224,6 @@ public class MobileInput extends InputHandler implements GestureListener{ } }).update(l -> l.setChecked(mode == breaking)); - //rotate button - table.addImageButton("icon-arrow", "clear-partial", 16 * 2f, () -> rotation = Mathf.mod(rotation + 1, 4)) - .update(i -> i.getImage().setRotationOrigin(rotation * 90, Align.center)) - .visible(() -> recipe != null && recipe.result.rotate); - //cancel button table.addImageButton("icon-cancel", "clear-partial", 16 * 2f, () -> { player.clearBuilding(); @@ -233,6 +231,11 @@ public class MobileInput extends InputHandler implements GestureListener{ recipe = null; }).visible(() -> player.isBuilding() || recipe != null || mode == breaking); + //rotate button + table.addImageButton("icon-arrow", "clear-partial", 16 * 2f, () -> rotation = Mathf.mod(rotation + 1, 4)) + .update(i -> i.getImage().setRotationOrigin(rotation * 90, Align.center)) + .visible(() -> recipe != null && recipe.result.rotate); + //confirm button table.addImageButton("icon-check", "clear-partial", 16 * 2f, () -> { for(PlaceRequest request : selection){ @@ -242,8 +245,10 @@ public class MobileInput extends InputHandler implements GestureListener{ if(tile != null){ if(!request.remove){ rotation = request.rotation; + Recipe before = recipe; recipe = request.recipe; tryPlaceBlock(tile.x, tile.y); + recipe = before; }else{ tryBreakBlock(tile.x, tile.y); } @@ -596,6 +601,10 @@ public class MobileInput extends InputHandler implements GestureListener{ showGuide("construction"); } + if(recipe == null && mode == placing){ + mode = none; + } + //automatically switch to placing after a new recipe is selected if(lastRecipe != recipe && mode == breaking && recipe != null){ mode = placing; diff --git a/core/src/io/anuke/mindustry/io/SaveFileVersion.java b/core/src/io/anuke/mindustry/io/SaveFileVersion.java index b4b60634a9..0b4b40f5d2 100644 --- a/core/src/io/anuke/mindustry/io/SaveFileVersion.java +++ b/core/src/io/anuke/mindustry/io/SaveFileVersion.java @@ -50,7 +50,7 @@ public abstract class SaveFileVersion{ stream.writeShort(world.height()); for(int i = 0; i < world.width() * world.height(); i++){ - Tile tile = world.tile(i); + Tile tile = world.tile(i % world.width(), i / world.width()); stream.writeByte(tile.getFloorID()); stream.writeByte(tile.getBlockID()); @@ -73,7 +73,7 @@ public abstract class SaveFileVersion{ int consecutives = 0; for(int j = i + 1; j < world.width() * world.height() && consecutives < 255; j++){ - Tile nextTile = world.tile(j); + Tile nextTile = world.tile(j % world.width(), j / world.width()); if(nextTile.getFloorID() != tile.getFloorID() || nextTile.block() != Blocks.air || nextTile.getElevation() != tile.getElevation()){ break; @@ -89,13 +89,13 @@ public abstract class SaveFileVersion{ //write visibility, length-run encoded for(int i = 0; i < world.width() * world.height(); i++){ - Tile tile = world.tile(i); + Tile tile = world.tile(i % world.width(), i / world.width()); boolean discovered = tile.discovered(); int consecutives = 0; for(int j = i + 1; j < world.width() * world.height() && consecutives < 32767*2-1; j++){ - Tile nextTile = world.tile(j); + Tile nextTile = world.tile(j % world.width(), j / world.width()); if(nextTile.discovered() != discovered){ break; diff --git a/core/src/io/anuke/mindustry/io/SaveIO.java b/core/src/io/anuke/mindustry/io/SaveIO.java index af0e9287b2..c6706a43a7 100644 --- a/core/src/io/anuke/mindustry/io/SaveIO.java +++ b/core/src/io/anuke/mindustry/io/SaveIO.java @@ -14,7 +14,7 @@ import java.util.zip.InflaterInputStream; import static io.anuke.mindustry.Vars.*; public class SaveIO{ - public static final IntArray breakingVersions = IntArray.with(47, 48, 49, 50, 51, 52, 53, 54, 55, 56); + public static final IntArray breakingVersions = IntArray.with(47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58); public static final IntMap versions = new IntMap<>(); public static final Array versionArray = Array.with( new Save16() diff --git a/core/src/io/anuke/mindustry/io/TypeIO.java b/core/src/io/anuke/mindustry/io/TypeIO.java index 94b3f0825f..2d0f9feb08 100644 --- a/core/src/io/anuke/mindustry/io/TypeIO.java +++ b/core/src/io/anuke/mindustry/io/TypeIO.java @@ -18,6 +18,7 @@ import io.anuke.mindustry.net.Packets.AdminAction; import io.anuke.mindustry.net.Packets.KickReason; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.Pos; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects.Effect; @@ -52,6 +53,10 @@ public class TypeIO{ @WriteClass(Unit.class) public static void writeUnit(ByteBuffer buffer, Unit unit){ + if(unit.getGroup() == null){ + buffer.put((byte)-1); + return; + } buffer.put((byte) unit.getGroup().getID()); buffer.putInt(unit.getID()); } @@ -59,6 +64,7 @@ public class TypeIO{ @ReadClass(Unit.class) public static Unit readUnit(ByteBuffer buffer){ byte gid = buffer.get(); + if(gid == -1) return null; int id = buffer.getInt(); return (Unit) Entities.getGroup(gid).getByID(id); } @@ -142,13 +148,12 @@ public class TypeIO{ @WriteClass(Tile.class) public static void writeTile(ByteBuffer buffer, Tile tile){ - buffer.putInt(tile == null ? -1 : tile.packedPosition()); + buffer.putInt(tile == null ? Pos.get(-1, -1) : tile.pos()); } @ReadClass(Tile.class) public static Tile readTile(ByteBuffer buffer){ - int position = buffer.getInt(); - return position == -1 ? null : world.tile(position); + return world.tile(buffer.getInt()); } @WriteClass(Block.class) @@ -166,7 +171,7 @@ public class TypeIO{ buffer.putShort((short)requests.length); for(BuildRequest request : requests){ buffer.put(request.breaking ? (byte) 1 : 0); - buffer.putInt(world.toPacked(request.x, request.y)); + buffer.putInt(Pos.get(request.x, request.y)); if(!request.breaking){ buffer.put(request.recipe.id); buffer.put((byte) request.rotation); @@ -184,11 +189,11 @@ public class TypeIO{ BuildRequest currentRequest; if(type == 1){ //remove - currentRequest = new BuildRequest(position % world.width(), position / world.width()); + currentRequest = new BuildRequest(Pos.x(position), Pos.y(position)); }else{ //place byte recipe = buffer.get(); byte rotation = buffer.get(); - currentRequest = new BuildRequest(position % world.width(), position / world.width(), rotation, content.recipe(recipe)); + currentRequest = new BuildRequest(Pos.x(position), Pos.y(position), rotation, content.recipe(recipe)); } reqs[i] = (currentRequest); diff --git a/core/src/io/anuke/mindustry/io/versions/Save16.java b/core/src/io/anuke/mindustry/io/versions/Save16.java index 3dd485c41f..7a4fc1e79e 100644 --- a/core/src/io/anuke/mindustry/io/versions/Save16.java +++ b/core/src/io/anuke/mindustry/io/versions/Save16.java @@ -59,7 +59,7 @@ public class Save16 extends SaveFileVersion{ stream.writeLong(TimeUtils.millis()); //last saved stream.writeLong(headless ? 0 : control.saves.getTotalPlaytime()); //playtime stream.writeInt(Version.build); //build - stream.writeInt(world.getSector() == null ? invalidSector : world.getSector().packedPosition()); //sector ID + stream.writeInt(world.getSector() == null ? invalidSector : world.getSector().pos()); //sector ID //--GENERAL STATE-- stream.writeByte(state.mode.ordinal()); //gamemode diff --git a/core/src/io/anuke/mindustry/maps/Sector.java b/core/src/io/anuke/mindustry/maps/Sector.java index bba6876781..e184409ae1 100644 --- a/core/src/io/anuke/mindustry/maps/Sector.java +++ b/core/src/io/anuke/mindustry/maps/Sector.java @@ -67,7 +67,7 @@ public class Sector{ return !headless && control.saves.getByID(saveID) != null; } - public int packedPosition(){ + public int pos(){ return Bits.packInt(x, y); } } diff --git a/core/src/io/anuke/mindustry/maps/Sectors.java b/core/src/io/anuke/mindustry/maps/Sectors.java index e80af4024a..0d94ff6d6b 100644 --- a/core/src/io/anuke/mindustry/maps/Sectors.java +++ b/core/src/io/anuke/mindustry/maps/Sectors.java @@ -53,7 +53,7 @@ public class Sectors{ world.loadSector(sector); logic.play(); if(!headless){ - sector.saveID = control.saves.addSave("sector-" + sector.packedPosition()).index; + sector.saveID = control.saves.addSave("sector-" + sector.pos()).index; } world.sectors.save(); world.setSector(sector); diff --git a/core/src/io/anuke/mindustry/maps/generation/WorldGenerator.java b/core/src/io/anuke/mindustry/maps/generation/WorldGenerator.java index db95af39f7..8686b6c80d 100644 --- a/core/src/io/anuke/mindustry/maps/generation/WorldGenerator.java +++ b/core/src/io/anuke/mindustry/maps/generation/WorldGenerator.java @@ -17,6 +17,7 @@ import io.anuke.mindustry.maps.Sector; import io.anuke.mindustry.maps.missions.Mission; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.Pos; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.Floor; import io.anuke.mindustry.world.blocks.OreBlock; @@ -86,7 +87,7 @@ public class WorldGenerator{ Tile tile = tiles[x][y]; if(tile.block().isMultiblock()){ - multiblocks.add(tile.packedPosition()); + multiblocks.add(tile.pos()); } } } @@ -95,8 +96,8 @@ public class WorldGenerator{ for(int i = 0; i < multiblocks.size; i++){ int pos = multiblocks.get(i); - int x = pos % tiles.length; - int y = pos / tiles.length; + int x = Pos.x(pos); + int y = Pos.y(pos); Block result = tiles[x][y].block(); Team team = tiles[x][y].getTeam(); diff --git a/core/src/io/anuke/mindustry/maps/missions/BattleMission.java b/core/src/io/anuke/mindustry/maps/missions/BattleMission.java index bd2e8e26a9..e1f5bc5614 100644 --- a/core/src/io/anuke/mindustry/maps/missions/BattleMission.java +++ b/core/src/io/anuke/mindustry/maps/missions/BattleMission.java @@ -38,7 +38,7 @@ public class BattleMission extends MissionWithStartingCore{ @Override public GameMode getMode(){ - return GameMode.noWaves; + return GameMode.attack; } @Override diff --git a/core/src/io/anuke/mindustry/maps/missions/Mission.java b/core/src/io/anuke/mindustry/maps/missions/Mission.java index 25c9c5574e..eba443be21 100644 --- a/core/src/io/anuke/mindustry/maps/missions/Mission.java +++ b/core/src/io/anuke/mindustry/maps/missions/Mission.java @@ -2,10 +2,8 @@ package io.anuke.mindustry.maps.missions; import com.badlogic.gdx.math.GridPoint2; import com.badlogic.gdx.utils.Array; -import io.anuke.mindustry.content.blocks.StorageBlocks; import io.anuke.mindustry.game.GameMode; import io.anuke.mindustry.game.SpawnGroup; -import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.UnlockableContent; import io.anuke.mindustry.maps.Sector; import io.anuke.mindustry.maps.generation.Generation; @@ -34,7 +32,7 @@ public abstract class Mission{ } public GameMode getMode(){ - return GameMode.noWaves; + return GameMode.attack; } /**Sets the message displayed on mission begin. Returns this mission for chaining.*/ diff --git a/core/src/io/anuke/mindustry/maps/missions/MissionWithStartingCore.java b/core/src/io/anuke/mindustry/maps/missions/MissionWithStartingCore.java index 1dbb2b81a3..a134891329 100644 --- a/core/src/io/anuke/mindustry/maps/missions/MissionWithStartingCore.java +++ b/core/src/io/anuke/mindustry/maps/missions/MissionWithStartingCore.java @@ -42,6 +42,13 @@ public abstract class MissionWithStartingCore extends Mission{ startingCoreTile.setBlock(StorageBlocks.core); startingCoreTile.setTeam(team); state.teams.get(team).cores.add(startingCoreTile); + + //makes sure there's a flat area around core + for(int dx = -2; dx <= 2; dx++){ + for(int dy = -2; dy <= 2; dy++){ + gen.tiles[startingCoreTile.x + dx][startingCoreTile.y + dy].setElevation(startingCoreTile.getElevation()); + } + } } /** diff --git a/core/src/io/anuke/mindustry/maps/missions/WaveMission.java b/core/src/io/anuke/mindustry/maps/missions/WaveMission.java index be7d83bf46..e31120af00 100644 --- a/core/src/io/anuke/mindustry/maps/missions/WaveMission.java +++ b/core/src/io/anuke/mindustry/maps/missions/WaveMission.java @@ -74,7 +74,7 @@ public class WaveMission extends MissionWithStartingCore{ @Override public void update(){ if(state.wave > target){ - state.mode = GameMode.noWaves; + state.mode = GameMode.attack; } } diff --git a/core/src/io/anuke/mindustry/net/Host.java b/core/src/io/anuke/mindustry/net/Host.java index 77a281d8ec..261c60fc7e 100644 --- a/core/src/io/anuke/mindustry/net/Host.java +++ b/core/src/io/anuke/mindustry/net/Host.java @@ -1,5 +1,7 @@ package io.anuke.mindustry.net; +import io.anuke.mindustry.game.GameMode; + public class Host{ public final String name; public final String address; @@ -8,8 +10,9 @@ public class Host{ public final int players; public final int version; public final String versionType; + public final GameMode mode; - public Host(String name, String address, String mapname, int wave, int players, int version, String versionType){ + public Host(String name, String address, String mapname, int wave, int players, int version, String versionType, GameMode mode){ this.name = name; this.address = address; this.players = players; @@ -17,5 +20,6 @@ public class Host{ this.wave = wave; this.version = version; this.versionType = versionType; + this.mode = mode; } } diff --git a/core/src/io/anuke/mindustry/net/NetworkIO.java b/core/src/io/anuke/mindustry/net/NetworkIO.java index 6e7687948e..f8a9a5ddbe 100644 --- a/core/src/io/anuke/mindustry/net/NetworkIO.java +++ b/core/src/io/anuke/mindustry/net/NetworkIO.java @@ -21,6 +21,7 @@ import io.anuke.ucore.util.Bits; import java.io.*; import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; import static io.anuke.mindustry.Vars.*; @@ -32,7 +33,7 @@ public class NetworkIO{ //--GENERAL STATE-- stream.writeByte(state.mode.ordinal()); //gamemode stream.writeUTF(world.getMap().name); //map name - stream.writeInt(world.getSector() == null ? invalidSector : world.getSector().packedPosition()); //sector ID + stream.writeInt(world.getSector() == null ? invalidSector : world.getSector().pos()); //sector ID stream.writeInt(world.getSector() == null ? 0 : world.getSector().completedMissions); //write tags @@ -56,7 +57,7 @@ public class NetworkIO{ stream.writeShort(world.height()); for(int i = 0; i < world.width() * world.height(); i++){ - Tile tile = world.tile(i); + Tile tile = world.tile(i % world.width(), i / world.width()); stream.writeByte(tile.getFloorID()); stream.writeByte(tile.getBlockID()); @@ -79,7 +80,7 @@ public class NetworkIO{ int consecutives = 0; for(int j = i + 1; j < world.width() * world.height() && consecutives < 255; j++){ - Tile nextTile = world.tile(j); + Tile nextTile = world.tile(j % world.width(), j / world.width()); if(nextTile.getFloorID() != tile.getFloorID() || nextTile.block() != Blocks.air || nextTile.getElevation() != tile.getElevation()){ break; @@ -95,13 +96,13 @@ public class NetworkIO{ //write visibility, length-run encoded for(int i = 0; i < world.width() * world.height(); i++){ - Tile tile = world.tile(i); + Tile tile = world.tile(i % world.width(), i / world.width());; boolean discovered = tile.discovered(); int consecutives = 0; for(int j = i + 1; j < world.width() * world.height() && consecutives < 32767*2-1; j++){ - Tile nextTile = world.tile(j); + Tile nextTile = world.tile(j % world.width(), j / world.width());; if(nextTile.discovered() != discovered){ break; @@ -129,7 +130,7 @@ public class NetworkIO{ stream.writeByte(data.cores.size); for(Tile tile : data.cores){ - stream.writeInt(tile.packedPosition()); + stream.writeInt(tile.pos()); } } @@ -298,24 +299,25 @@ public class NetworkIO{ int maxlen = 32; String host = (headless ? "Server" : players[0].name); - String map = world.getMap().name; + String map = world.getMap() == null ? "None" : world.getMap().name; host = host.substring(0, Math.min(host.length(), maxlen)); map = map.substring(0, Math.min(map.length(), maxlen)); ByteBuffer buffer = ByteBuffer.allocate(128); - buffer.put((byte) host.getBytes().length); - buffer.put(host.getBytes()); + buffer.put((byte) host.getBytes(StandardCharsets.UTF_8).length); + buffer.put(host.getBytes(StandardCharsets.UTF_8)); - buffer.put((byte) map.getBytes().length); - buffer.put(map.getBytes()); + buffer.put((byte) map.getBytes(StandardCharsets.UTF_8).length); + buffer.put(map.getBytes(StandardCharsets.UTF_8)); buffer.putInt(playerGroup.size()); buffer.putInt(state.wave); buffer.putInt(Version.build); - buffer.put((byte)Version.type.getBytes().length); - buffer.put(Version.type.getBytes()); + buffer.put((byte)Version.type.getBytes(StandardCharsets.UTF_8).length); + buffer.put(Version.type.getBytes(StandardCharsets.UTF_8)); + buffer.put((byte)state.mode.ordinal()); return buffer; } @@ -328,8 +330,8 @@ public class NetworkIO{ byte[] mb = new byte[mlength]; buffer.get(mb); - String host = new String(hb); - String map = new String(mb); + String host = new String(hb, StandardCharsets.UTF_8); + String map = new String(mb, StandardCharsets.UTF_8); int players = buffer.getInt(); int wave = buffer.getInt(); @@ -337,8 +339,9 @@ public class NetworkIO{ byte tlength = buffer.get(); byte[] tb = new byte[tlength]; buffer.get(tb); - String vertype = new String(tb); + String vertype = new String(tb, StandardCharsets.UTF_8); + GameMode mode = GameMode.values()[buffer.get()]; - return new Host(host, hostAddress, map, wave, players, version, vertype); + return new Host(host, hostAddress, map, wave, players, version, vertype, mode); } } diff --git a/core/src/io/anuke/mindustry/type/Mech.java b/core/src/io/anuke/mindustry/type/Mech.java index f075f1c2e1..744bf11be1 100644 --- a/core/src/io/anuke/mindustry/type/Mech.java +++ b/core/src/io/anuke/mindustry/type/Mech.java @@ -34,6 +34,7 @@ public class Mech extends UnlockableContent{ public Color trailColorTo = Palette.boostTo; public int itemCapacity = 30; public boolean turnCursor = true; + public boolean canHeal = false; public float weaponOffsetX, weaponOffsetY; public Weapon weapon = Weapons.blaster; diff --git a/core/src/io/anuke/mindustry/ui/dialogs/AdminsDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/AdminsDialog.java index e1c9001874..31496a5e3a 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/AdminsDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/AdminsDialog.java @@ -41,17 +41,10 @@ public class AdminsDialog extends FloatingDialog{ ui.showConfirm("$text.confirm", "$text.confirmunadmin", () -> { netServer.admins.unAdminPlayer(info.id); playerGroup.forEach(player -> { - if(player.uuid.equals(info.id)){ + if(player != null && player.uuid != null && player.uuid.equals(info.id)){ player.isAdmin = false; } }); - /* - for(Player player : playerGroup.all()){ - if(player.con != null){ - player.isAdmin = false; - break; - } - }*/ setup(); }); }).size(h).pad(-14f); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/FileChooser.java b/core/src/io/anuke/mindustry/ui/dialogs/FileChooser.java index be56e08427..b608f3527c 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/FileChooser.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/FileChooser.java @@ -38,10 +38,6 @@ public class FileChooser extends FloatingDialog{ private Consumer selectListener; private boolean open; - public FileChooser(String title, boolean open, Consumer result){ - this(title, defaultFilter, open, result); - } - public FileChooser(String title, Predicate filter, boolean open, Consumer result){ super(title); this.open = open; @@ -127,7 +123,7 @@ public class FileChooser extends FloatingDialog{ updateFiles(true); }); - icontable.defaults().height(50).growX().uniform(); + icontable.defaults().height(50).growX().padTop(5).uniform(); icontable.add(home); icontable.add(back); icontable.add(forward); @@ -202,7 +198,7 @@ public class FileChooser extends FloatingDialog{ //macs are confined to the Downloads/ directory if(!OS.isMac){ Image upimage = new Image("icon-folder-parent"); - TextButton upbutton = new TextButton(".." + directory.toString()); + TextButton upbutton = new TextButton(".." + directory.toString(), "clear-toggle"); upbutton.clicked(() -> { directory = directory.parent(); updateFiles(true); @@ -224,7 +220,7 @@ public class FileChooser extends FloatingDialog{ String filename = file.name(); - TextButton button = new TextButton(shorten(filename), "toggle"); + TextButton button = new TextButton(shorten(filename), "clear-toggle"); group.add(button); button.clicked(() -> { diff --git a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java index cc3de460cb..c81c77e13b 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java @@ -96,11 +96,11 @@ public class JoinDialog extends FloatingDialog{ //why are java lambdas this bad TextButton[] buttons = {null}; - TextButton button = buttons[0] = remote.addButton("[accent]" + server.displayIP(), () -> { + TextButton button = buttons[0] = remote.addButton("[accent]" + server.displayIP(), "clear", () -> { if(!buttons[0].childrenPressed()){ connect(server.ip, server.port); } - }).width(targetWidth()).height(150f).pad(4f).get(); + }).width(targetWidth()).height(155f).pad(4f).get(); button.getLabel().setWrap(true); @@ -156,10 +156,10 @@ public class JoinDialog extends FloatingDialog{ versionString = Bundles.get("text.server.outdated"); }else if(host.version < Version.build && Version.build != -1){ versionString = Bundles.get("text.server.outdated") + "\n" + - Bundles.format("text.server.version", host.version); + Bundles.format("text.server.version", host.version, ""); }else if(host.version > Version.build && Version.build != -1){ versionString = Bundles.get("text.server.outdated.client") + "\n" + - Bundles.format("text.server.version", host.version); + Bundles.format("text.server.version", host.version, ""); }else{ versionString = Bundles.format("text.server.version", host.version, host.versionType); } @@ -268,12 +268,13 @@ public class JoinDialog extends FloatingDialog{ if(totalHosts == 0){ local.clear(); } + local.background((Drawable) null); totalHosts ++; float w = targetWidth(); local.row(); - TextButton button = local.addButton("[accent]" + host.name, () -> connect(host.address, port)) + TextButton button = local.addButton("[accent]" + host.name, "clear", () -> connect(host.address, port)) .width(w).height(80f).pad(4f).get(); button.left(); button.row(); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java index facfcab706..d402ed9eeb 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java @@ -161,6 +161,7 @@ public class LoadDialog extends FloatingDialog{ control.saves.importSave(file); setup(); }catch(IOException e){ + e.printStackTrace(); ui.showError(Bundles.format("text.save.import.fail", Strings.parseException(e, false))); } }else{ diff --git a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java index 6e09a4c468..a0f3694477 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java @@ -24,9 +24,13 @@ import io.anuke.ucore.scene.Element; import io.anuke.ucore.scene.Group; import io.anuke.ucore.scene.actions.Actions; import io.anuke.ucore.scene.event.Touchable; -import io.anuke.ucore.scene.ui.*; +import io.anuke.ucore.scene.ui.Image; +import io.anuke.ucore.scene.ui.ImageButton; +import io.anuke.ucore.scene.ui.Label; +import io.anuke.ucore.scene.ui.TextButton; import io.anuke.ucore.scene.ui.layout.Stack; import io.anuke.ucore.scene.ui.layout.Table; +import io.anuke.ucore.scene.ui.layout.Unit; import io.anuke.ucore.util.Bundles; import io.anuke.ucore.util.Mathf; @@ -347,7 +351,7 @@ public class HudFragment extends Fragment{ if(shown){ shown = false; blockfrag.toggle(dur, in); - wavetable.actions(Actions.translateBy(0, (wavetable.getHeight() + dsize + 6) - wavetable.getTranslation().y, dur, in)); + wavetable.actions(Actions.translateBy(0, (wavetable.getHeight() + Unit.dp.scl(dsize) + Unit.dp.scl(6)) - wavetable.getTranslation().y, dur, in)); infolabel.actions(Actions.translateBy(0, (wavetable.getHeight()) - wavetable.getTranslation().y, dur, in)); }else{ shown = true; diff --git a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java index 0ed4a6d9b6..f7c9944b67 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java @@ -36,9 +36,11 @@ public class PlacementFragment extends Fragment{ Tile hoverTile; Table blockTable, toggler, topTable; boolean shown = true; + boolean lastGround; public PlacementFragment(){ Events.on(WorldLoadGraphicsEvent.class, event -> { + currentCategory = Category.turret; Group group = toggler.getParent(); toggler.remove(); build(group); @@ -109,13 +111,14 @@ public class PlacementFragment extends Fragment{ frame.table("button-edge-2", top -> { topTable = top; top.add(new Table()).growX().update(topTable -> { - if((tileDisplayBlock() == null && lastDisplay == getSelected()) || - (tileDisplayBlock() != null && lastDisplay == tileDisplayBlock())) return; + if((tileDisplayBlock() == null && lastDisplay == getSelected() && !lastGround) || + (tileDisplayBlock() != null && lastDisplay == tileDisplayBlock() && lastGround)) return; topTable.clear(); topTable.top().left().margin(5); lastDisplay = getSelected(); + lastGround = tileDisplayBlock() != null; if(lastDisplay != null){ //show selected recipe topTable.table(header -> { @@ -181,7 +184,7 @@ public class PlacementFragment extends Fragment{ categories.addImageButton("icon-" + cat.name(), "clear-toggle", 16*2, () -> { currentCategory = cat; rebuildCategory.run(); - }).group(group); + }).group(group).update(i -> i.setChecked(currentCategory == cat)); if(cat.ordinal() %2 == 1) categories.row(); } diff --git a/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java b/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java index 333659134d..d9876ef1b3 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java @@ -104,19 +104,19 @@ public class PlayerListFragment extends Fragment{ if((Net.server() || players[0].isAdmin) && !player.isLocal && (!player.isAdmin || Net.server())){ button.add().growY(); - float bs = (h + 14) / 2f; + float bs = (h) / 2f; button.table(t -> { t.defaults().size(bs); - t.addImageButton("icon-ban", 14 * 2, + t.addImageButton("icon-ban", "clear-partial", 14 * 2, () -> ui.showConfirm("$text.confirm", "$text.confirmban", () -> Call.onAdminRequest(player, AdminAction.ban))); - t.addImageButton("icon-cancel", 16 * 2, + t.addImageButton("icon-cancel", "clear-partial", 16 * 2, () -> ui.showConfirm("$text.confirm", "$text.confirmkick", () -> Call.onAdminRequest(player, AdminAction.kick))); t.row(); - t.addImageButton("icon-admin", "toggle", 14 * 2, () -> { + t.addImageButton("icon-admin", "clear-toggle-partial", 14 * 2, () -> { if(Net.client()) return; String id = player.uuid; @@ -132,9 +132,9 @@ public class PlayerListFragment extends Fragment{ .touchable(() -> Net.client() ? Touchable.disabled : Touchable.enabled) .checked(player.isAdmin); - t.addImageButton("icon-zoom-small", 14 * 2, () -> ui.showError("Currently unimplemented.")/*Call.onAdminRequest(player, AdminAction.trace)*/); + t.addImageButton("icon-zoom-small", "clear-partial", 14 * 2, () -> ui.showError("Currently unimplemented.")/*Call.onAdminRequest(player, AdminAction.trace)*/); - }).padRight(12).padTop(-5).padLeft(0).padBottom(-10).size(bs + 10f, bs); + }).padRight(12).size(bs + 10f, bs); } content.add(button).padBottom(-6).width(350f).maxHeight(h + 14); diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java index 7233ed101a..0e574b0303 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -164,7 +164,7 @@ public class Block extends BaseBlock { for(int i = 0; i < tile.entity.power.links.size; i++){ Tile other = world.tile(tile.entity.power.links.get(i)); if(other != null && other.entity != null && other.entity.power != null){ - other.entity.power.links.removeValue(tile.packedPosition()); + other.entity.power.links.removeValue(tile.pos()); } } } @@ -173,7 +173,7 @@ public class Block extends BaseBlock { out.clear(); for(Tile other : tile.entity.proximity()){ if(other.entity.power != null && !(consumesPower && other.block().consumesPower && !outputsPower && !other.block().outputsPower) - && !tile.entity.power.links.contains(other.packedPosition())){ + && !tile.entity.power.links.contains(other.pos())){ out.add(other); } } @@ -337,10 +337,8 @@ public class Block extends BaseBlock { public void setBars(){ if(hasPower) bars.add(new BlockBar(BarType.power, true, tile -> tile.entity.power.amount / powerCapacity)); - if(hasLiquids) - bars.add(new BlockBar(BarType.liquid, true, tile -> tile.entity.liquids.total() / liquidCapacity)); - if(hasItems) - bars.add(new BlockBar(BarType.inventory, true, tile -> (float) tile.entity.items.total() / itemCapacity)); + if(hasLiquids) bars.add(new BlockBar(BarType.liquid, true, tile -> tile.entity.liquids.total() / liquidCapacity)); + if(hasItems) bars.add(new BlockBar(BarType.inventory, true, tile -> (float) tile.entity.items.total() / itemCapacity)); } public String name(){ @@ -543,16 +541,16 @@ public class Block extends BaseBlock { public Array getDebugInfo(Tile tile){ return Array.with( - "block", tile.block().name, - "floor", tile.floor().name, - "x", tile.x, - "y", tile.y, - "entity.name", tile.entity.getClass(), - "entity.x", tile.entity.x, - "entity.y", tile.entity.y, - "entity.id", tile.entity.id, - "entity.items.total", hasItems ? tile.entity.items.total() : null, - "entity.graph", tile.entity.power != null && tile.entity.power.graph != null ? tile.entity.power.graph.getID() : null + "block", tile.block().name, + "floor", tile.floor().name, + "x", tile.x, + "y", tile.y, + "entity.name", tile.entity.getClass(), + "entity.x", tile.entity.x, + "entity.y", tile.entity.y, + "entity.id", tile.entity.id, + "entity.items.total", hasItems ? tile.entity.items.total() : null, + "entity.graph", tile.entity.power != null && tile.entity.power.graph != null ? tile.entity.power.graph.getID() : null ); } } \ No newline at end of file diff --git a/core/src/io/anuke/mindustry/world/Pos.java b/core/src/io/anuke/mindustry/world/Pos.java new file mode 100644 index 0000000000..bdbf3a2f7c --- /dev/null +++ b/core/src/io/anuke/mindustry/world/Pos.java @@ -0,0 +1,20 @@ +package io.anuke.mindustry.world; + +/**Methods for a packed position 'struct', contained in an int.*/ +public class Pos{ + + /**Returns packed position from an x/y position. The values must be within short limits.*/ + public static int get(int x, int y){ + return (((short)x) << 16) | (((short)y) & 0xFFFF); + } + + /**Returns the x component of a position.*/ + public static short x(int pos){ + return (short) (pos >>> 16); + } + + /**Returns the y component of a position.*/ + public static short y(int pos){ + return (short) (pos & 0xFFFF); + } +} diff --git a/core/src/io/anuke/mindustry/world/Tile.java b/core/src/io/anuke/mindustry/world/Tile.java index b6b87da8d7..af19d1ad9c 100644 --- a/core/src/io/anuke/mindustry/world/Tile.java +++ b/core/src/io/anuke/mindustry/world/Tile.java @@ -71,8 +71,9 @@ public class Tile implements PosTrait, TargetTrait{ return visibility > 0; } - public int packedPosition(){ - return x + y * world.width(); + /**Returns this tile's position as a {@link Pos}.*/ + public int pos(){ + return Pos.get(x, y); } public byte getBlockID(){ @@ -104,10 +105,6 @@ public class Tile implements PosTrait, TargetTrait{ return (T) entity; } - public int id(){ - return x + y * world.width(); - } - public float worldx(){ return x * tilesize; } diff --git a/core/src/io/anuke/mindustry/world/blocks/Floor.java b/core/src/io/anuke/mindustry/world/blocks/Floor.java index 8c27abc074..87dc7b630b 100644 --- a/core/src/io/anuke/mindustry/world/blocks/Floor.java +++ b/core/src/io/anuke/mindustry/world/blocks/Floor.java @@ -130,16 +130,16 @@ public class Floor extends Block{ @Override public void drawNonLayer(Tile tile){ - MathUtils.random.setSeed(tile.id()); + MathUtils.random.setSeed(tile.pos()); drawEdges(tile, true); } @Override public void draw(Tile tile){ - MathUtils.random.setSeed(tile.id()); + MathUtils.random.setSeed(tile.pos()); - Draw.rect(variantRegions[Mathf.randomSeed(tile.id(), 0, Math.max(0, variantRegions.length - 1))], tile.worldx(), tile.worldy()); + Draw.rect(variantRegions[Mathf.randomSeed(tile.pos(), 0, Math.max(0, variantRegions.length - 1))], tile.worldx(), tile.worldy()); if(tile.hasCliffs() && cliffRegions != null){ for(int i = 0; i < 4; i++){ diff --git a/core/src/io/anuke/mindustry/world/blocks/OreBlock.java b/core/src/io/anuke/mindustry/world/blocks/OreBlock.java index 6abb723921..5fcaeb9765 100644 --- a/core/src/io/anuke/mindustry/world/blocks/OreBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/OreBlock.java @@ -39,14 +39,14 @@ public class OreBlock extends Floor{ @Override public void draw(Tile tile){ - Draw.rect(variantRegions[Mathf.randomSeed(tile.id(), 0, Math.max(0, variantRegions.length - 1))], tile.worldx(), tile.worldy()); + Draw.rect(variantRegions[Mathf.randomSeed(tile.pos(), 0, Math.max(0, variantRegions.length - 1))], tile.worldx(), tile.worldy()); drawEdges(tile, false); } @Override public void drawNonLayer(Tile tile){ - MathUtils.random.setSeed(tile.id()); + MathUtils.random.setSeed(tile.pos()); base.drawEdges(tile, true); } diff --git a/core/src/io/anuke/mindustry/world/blocks/Rock.java b/core/src/io/anuke/mindustry/world/blocks/Rock.java index f5771124fe..aecca1b444 100644 --- a/core/src/io/anuke/mindustry/world/blocks/Rock.java +++ b/core/src/io/anuke/mindustry/world/blocks/Rock.java @@ -19,7 +19,7 @@ public class Rock extends Block{ @Override public void draw(Tile tile){ if(variants > 0){ - Draw.rect(regions[Mathf.randomSeed(tile.id(), 0, Math.max(0, regions.length - 1))], tile.worldx(), tile.worldy()); + Draw.rect(regions[Mathf.randomSeed(tile.pos(), 0, Math.max(0, regions.length - 1))], tile.worldx(), tile.worldy()); }else{ Draw.rect(region, tile.worldx(), tile.worldy()); } @@ -28,7 +28,7 @@ public class Rock extends Block{ @Override public void drawShadow(Tile tile){ if(shadowRegions != null){ - Draw.rect(shadowRegions[(Mathf.randomSeed(tile.id(), 0, variants - 1))], tile.worldx(), tile.worldy()); + Draw.rect(shadowRegions[(Mathf.randomSeed(tile.pos(), 0, variants - 1))], tile.worldx(), tile.worldy()); }else if(shadowRegion != null){ Draw.rect(shadowRegion, tile.drawx(), tile.drawy()); } diff --git a/core/src/io/anuke/mindustry/world/blocks/SelectionTrait.java b/core/src/io/anuke/mindustry/world/blocks/SelectionTrait.java index 9c84856aac..8d31879965 100644 --- a/core/src/io/anuke/mindustry/world/blocks/SelectionTrait.java +++ b/core/src/io/anuke/mindustry/world/blocks/SelectionTrait.java @@ -4,43 +4,32 @@ import com.badlogic.gdx.utils.Array; import io.anuke.mindustry.type.Item; import io.anuke.ucore.function.Consumer; import io.anuke.ucore.function.Supplier; -import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.scene.style.TextureRegionDrawable; import io.anuke.ucore.scene.ui.ButtonGroup; import io.anuke.ucore.scene.ui.ImageButton; import io.anuke.ucore.scene.ui.layout.Table; -import static io.anuke.mindustry.Vars.*; +import static io.anuke.mindustry.Vars.content; +import static io.anuke.mindustry.Vars.control; public interface SelectionTrait{ default void buildItemTable(Table table, Supplier holder, Consumer consumer){ - buildItemTable(table, false, holder, consumer); - } - - default void buildItemTable(Table table, boolean nullItem, Supplier holder, Consumer consumer){ Array items = content.items(); ButtonGroup group = new ButtonGroup<>(); + group.setMinCheckCount(0); Table cont = new Table(); cont.defaults().size(38); int i = 0; - if(nullItem){ - ImageButton button = cont.addImageButton("white", "clear-toggle", 24, () -> consumer.accept(null)).group(group).get(); - button.getStyle().imageUp = new TextureRegionDrawable(Draw.region("icon-nullitem")); - button.setChecked(holder.get() == null); - - i ++; - } - for(Item item : items){ if(!control.unlocks.isUnlocked(item)) continue; - ImageButton button = cont.addImageButton("white", "clear-toggle", 24, () -> consumer.accept(item)) - .group(group).get(); + ImageButton button = cont.addImageButton("white", "clear-toggle", 24, () -> {}).group(group).get(); + button.changed(() -> consumer.accept(button.isChecked() ? item : null)); button.getStyle().imageUp = new TextureRegionDrawable(item.region); button.setChecked(holder.get() == item); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java b/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java index 997c821de9..80cff5f2d5 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java @@ -83,10 +83,10 @@ public class MendProjector extends Block{ if(other == null) continue; other = other.target(); - if(other.getTeamID() == tile.getTeamID() && !healed.contains(other.packedPosition()) && other.entity != null && other.entity.health < other.entity.maxHealth()){ + if(other.getTeamID() == tile.getTeamID() && !healed.contains(other.pos()) && other.entity != null && other.entity.health < other.entity.maxHealth()){ other.entity.healBy(other.entity.maxHealth() * (healPercent + entity.phaseHeat*phaseBoost)/100f); Effects.effect(BlockFx.healBlockFull, Hue.mix(color, phase, entity.phaseHeat), other.drawx(), other.drawy(), other.block().size); - healed.add(other.packedPosition()); + healed.add(other.pos()); } } } diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java b/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java index 615a6fa5a8..a19d6c9649 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java @@ -85,11 +85,11 @@ public class OverdriveProjector extends Block{ if(other == null) continue; other = other.target(); - if(other.getTeamID() == tile.getTeamID() && !healed.contains(other.packedPosition()) && other.entity != null){ + if(other.getTeamID() == tile.getTeamID() && !healed.contains(other.pos()) && other.entity != null){ other.entity.timeScaleDuration = Math.max(other.entity.timeScaleDuration, reload + 1f); other.entity.timeScale = Math.max(other.entity.timeScale, realBoost); Effects.effect(BlockFx.overdriveBlockFull, Hue.mix(color, phase, entity.phaseHeat), other.drawx(), other.drawy(), other.block().size); - healed.add(other.packedPosition()); + healed.add(other.pos()); } } } diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java b/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java index b53f39d1f3..5d15e6ae9c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java @@ -15,6 +15,7 @@ import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Edges; +import io.anuke.mindustry.world.Pos; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.meta.BlockGroup; import io.anuke.ucore.core.Timers; @@ -58,8 +59,8 @@ public class ItemBridge extends Block{ public static void linkItemBridge(Player player, Tile tile, Tile other){ ItemBridgeEntity entity = tile.entity(); ItemBridgeEntity oe = other.entity(); - entity.link = other.packedPosition(); - oe.incoming.add(tile.packedPosition()); + entity.link = other.pos(); + oe.incoming.add(tile.pos()); } @Remote(targets = Loc.both, called = Loc.server, forward = true) @@ -68,7 +69,7 @@ public class ItemBridge extends Block{ entity.link = -1; if(other != null){ ItemBridgeEntity oe = other.entity(); - oe.incoming.remove(tile.packedPosition()); + oe.incoming.remove(tile.pos()); } } @@ -90,7 +91,7 @@ public class ItemBridge extends Block{ Call.linkItemBridge(null, last, tile); } } - lastPlaced = tile.packedPosition(); + lastPlaced = tile.pos(); } @Override @@ -122,7 +123,7 @@ public class ItemBridge extends Block{ for(int j = 0; j < 4; j++){ Tile other = tile.getNearby(Geometry.d4[j].x * i, Geometry.d4[j].y * i); if(linkValid(tile, other)){ - boolean linked = other.packedPosition() == entity.link; + boolean linked = other.pos() == entity.link; Draw.color(linked ? Palette.place : Palette.breakInvalid); Lines.square(other.drawx(), other.drawy(), @@ -139,7 +140,7 @@ public class ItemBridge extends Block{ ItemBridgeEntity entity = tile.entity(); if(linkValid(tile, other)){ - if(entity.link == other.packedPosition()){ + if(entity.link == other.pos()){ Call.unlinkItemBridge(null, tile, other); }else{ Call.linkItemBridge(null, tile, other); @@ -254,7 +255,7 @@ public class ItemBridge extends Block{ if(rel == rel2) return false; }else{ - return source.block() instanceof ItemBridge && source.entity().link == tile.packedPosition() && tile.entity.items.total() < itemCapacity; + return source.block() instanceof ItemBridge && source.entity().link == tile.pos() && tile.entity.items.total() < itemCapacity; } return tile.entity.items.total() < itemCapacity; @@ -273,9 +274,7 @@ public class ItemBridge extends Block{ while(it.hasNext){ int v = it.next(); - int x = v % world.width(); - int y = v / world.width(); - if(tile.absoluteRelativeTo(x, y) == i){ + if(tile.absoluteRelativeTo(Pos.x(v), Pos.y(v)) == i){ return false; } } @@ -315,7 +314,7 @@ public class ItemBridge extends Block{ return false; } - return other.block() == this && (!checkDouble || other.entity().link != tile.packedPosition()); + return other.block() == this && (!checkDouble || other.entity().link != tile.pos()); } public static class ItemBridgeEntity extends TileEntity{ diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidExtendingBridge.java b/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidExtendingBridge.java index 3a2ca9b15e..7f28ea8ec5 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidExtendingBridge.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidExtendingBridge.java @@ -3,6 +3,7 @@ package io.anuke.mindustry.world.blocks.distribution; import com.badlogic.gdx.utils.IntSet.IntSetIterator; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Liquid; +import io.anuke.mindustry.world.Pos; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.meta.BlockGroup; import io.anuke.ucore.core.Timers; @@ -65,9 +66,7 @@ public class LiquidExtendingBridge extends ExtendingItemBridge{ while(it.hasNext){ int v = it.next(); - int x = v % world.width(); - int y = v / world.width(); - if(tile.absoluteRelativeTo(x, y) == i){ + if(tile.absoluteRelativeTo(Pos.x(v), Pos.y(v)) == i){ return false; } } diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidTank.java b/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidTank.java new file mode 100644 index 0000000000..c73ab0d2d0 --- /dev/null +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidTank.java @@ -0,0 +1,8 @@ +package io.anuke.mindustry.world.blocks.distribution; + +public class LiquidTank extends LiquidRouter{ + + public LiquidTank(String name){ + super(name); + } +} 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 8e33ea1e4d..2c901785c1 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java @@ -225,11 +225,11 @@ public class MassDriver extends Block{ MassDriverEntity entity = tile.entity(); - if(entity.link == other.packedPosition()){ + if(entity.link == other.pos()){ Call.linkMassDriver(null, tile, -1); return false; }else if(other.block() instanceof MassDriver && other.distanceTo(tile) <= range){ - Call.linkMassDriver(null, tile, other.packedPosition()); + Call.linkMassDriver(null, tile, other.pos()); return false; } 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 c7a5737e54..d8e5b57594 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java @@ -4,6 +4,7 @@ import io.anuke.annotations.Annotations.Loc; import io.anuke.annotations.Annotations.Remote; import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.TileEntity; +import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; @@ -12,7 +13,6 @@ import io.anuke.mindustry.world.meta.BlockGroup; import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.ucore.util.Mathf; -import io.anuke.mindustry.gen.Call; import java.io.DataInput; import java.io.DataOutput; @@ -40,15 +40,15 @@ public class Sorter extends Block implements SelectionTrait{ @Override public void playerPlaced(Tile tile){ - if(lastItem != null){ - threads.runDelay(() -> Call.setSorterItem(null, tile, lastItem)); - } + threads.runDelay(() -> Call.setSorterItem(null, tile, lastItem)); } @Remote(targets = Loc.both, called = Loc.both, forward = true) public static void setSorterItem(Player player, Tile tile, Item item){ SorterEntity entity = tile.entity(); - if(entity != null) entity.sortItem = item; + if(entity != null){ + entity.sortItem = item; + } } @Override @@ -56,6 +56,7 @@ public class Sorter extends Block implements SelectionTrait{ super.draw(tile); SorterEntity entity = tile.entity(); + if(entity.sortItem == null) return; Draw.color(entity.sortItem.color); Draw.rect("blank", tile.worldx(), tile.worldy(), 4f, 4f); @@ -130,16 +131,17 @@ public class Sorter extends Block implements SelectionTrait{ } public static class SorterEntity extends TileEntity{ - public Item sortItem = content.item(0); + public Item sortItem; @Override public void writeConfig(DataOutput stream) throws IOException{ - stream.writeByte(sortItem.id); + stream.writeByte(sortItem == null ? -1 : sortItem.id); } @Override public void readConfig(DataInput stream) throws IOException{ - sortItem = content.items().get(stream.readByte()); + byte b = stream.readByte(); + sortItem = b == -1 ? null : content.items().get(b); } } } diff --git a/core/src/io/anuke/mindustry/world/blocks/power/LiquidHeatGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/LiquidHeatGenerator.java index 67a5bed015..87e5275cc9 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/LiquidHeatGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/LiquidHeatGenerator.java @@ -14,7 +14,7 @@ public class LiquidHeatGenerator extends LiquidGenerator{ public void setStats(){ super.setStats(); - stats.add(BlockStat.basePowerGeneration, maxLiquidGenerate * powerPerLiquid * 60f, StatUnit.powerSecond); + stats.add(BlockStat.basePowerGeneration, maxLiquidGenerate * powerPerLiquid * 60f * 0.5f, StatUnit.powerSecond); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java index 490391b3d6..af6bdb543b 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java @@ -134,9 +134,9 @@ public class PowerGraph{ child.entity.power.graph = this; add(child); for(Tile next : child.block().getPowerConnections(child, outArray2)){ - if(next.entity.power != null && next.entity.power.graph == null && !closedSet.contains(next.packedPosition())){ + if(next.entity.power != null && next.entity.power.graph == null && !closedSet.contains(next.pos())){ queue.addLast(next); - closedSet.add(next.packedPosition()); + closedSet.add(next.pos()); } } } @@ -156,9 +156,9 @@ public class PowerGraph{ child.entity.power.graph = graph; graph.add(child); for(Tile next : child.block().getPowerConnections(child, outArray2)){ - if(next != tile && next.entity.power != null && next.entity.power.graph == null && !closedSet.contains(next.packedPosition())){ + if(next != tile && next.entity.power != null && next.entity.power.graph == null && !closedSet.contains(next.pos())){ queue.addLast(next); - closedSet.add(next.packedPosition()); + closedSet.add(next.pos()); } } } 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 21d50003f1..3ac43cc98d 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java @@ -47,18 +47,19 @@ public class PowerNode extends PowerBlock{ @Remote(targets = Loc.both, called = Loc.server, forward = true) public static void linkPowerNodes(Player player, Tile tile, Tile other){ - if(tile.entity.power == null || !((PowerNode)tile.block()).linkValid(tile, other)) return; + if(tile.entity.power == null || !((PowerNode)tile.block()).linkValid(tile, other) + || tile.entity.power.links.size >= ((PowerNode)tile.block()).maxNodes) return; TileEntity entity = tile.entity(); - if(!entity.power.links.contains(other.packedPosition())){ - entity.power.links.add(other.packedPosition()); + if(!entity.power.links.contains(other.pos())){ + entity.power.links.add(other.pos()); } if(other.getTeamID() == tile.getTeamID()){ - if(!other.entity.power.links.contains(tile.packedPosition())){ - other.entity.power.links.add(tile.packedPosition()); + if(!other.entity.power.links.contains(tile.pos())){ + other.entity.power.links.add(tile.pos()); } } @@ -67,7 +68,7 @@ public class PowerNode extends PowerBlock{ @Remote(targets = Loc.both, called = Loc.server, forward = true) public static void unlinkPowerNodes(Player player, Tile tile, Tile other){ - if(tile.entity.power == null) return; + if(tile.entity.power == null || other.entity == null || other.entity.power == null) return; TileEntity entity = tile.entity(); @@ -75,8 +76,8 @@ public class PowerNode extends PowerBlock{ PowerGraph tg = entity.power.graph; tg.clear(); - entity.power.links.removeValue(other.packedPosition()); - other.entity.power.links.removeValue(tile.packedPosition()); + entity.power.links.removeValue(other.pos()); + other.entity.power.links.removeValue(tile.pos()); //reflow from this point, covering all tiles on this side tg.reflow(tile); @@ -99,14 +100,14 @@ public class PowerNode extends PowerBlock{ if(linkValid(tile, before) && before.block() instanceof PowerNode){ for(Tile near : before.entity.proximity()){ if(near.target() == tile){ - lastPlaced = tile.packedPosition(); + lastPlaced = tile.pos(); return; } } Call.linkPowerNodes(null, tile, before); } - lastPlaced = tile.packedPosition(); + lastPlaced = tile.pos(); } @Override @@ -202,7 +203,7 @@ public class PowerNode extends PowerBlock{ for(int i = 0; i < entity.power.links.size; i++){ Tile link = world.tile(entity.power.links.get(i)); if(linkValid(tile, link) && (!(link.block() instanceof PowerNode) - || ((tile.block().size > link.block().size) || (tile.block().size == link.block().size && tile.id() < link.id())))){ + || ((tile.block().size > link.block().size) || (tile.block().size == link.block().size && tile.pos() < link.pos())))){ drawLaser(tile, link); } } @@ -211,7 +212,7 @@ public class PowerNode extends PowerBlock{ } protected boolean linked(Tile tile, Tile other){ - return tile.entity.power.links.contains(other.packedPosition()); + return tile.entity.power.links.contains(other.pos()); } protected boolean linkValid(Tile tile, Tile link){ @@ -227,7 +228,7 @@ public class PowerNode extends PowerBlock{ return Vector2.dst(tile.drawx(), tile.drawy(), link.drawx(), link.drawy()) <= Math.max(laserRange * tilesize, ((PowerNode) link.block()).laserRange * tilesize) + (link.block().size - 1) * tilesize / 2f + (tile.block().size - 1) * tilesize / 2f && - (!checkMaxNodes || (oe.power.links.size < ((PowerNode) link.block()).maxNodes || oe.power.links.contains(tile.packedPosition()))); + (!checkMaxNodes || (oe.power.links.size < ((PowerNode) link.block()).maxNodes || oe.power.links.contains(tile.pos()))); }else{ return Vector2.dst(tile.drawx(), tile.drawy(), link.drawx(), link.drawy()) <= laserRange * tilesize + (link.block().size - 1) * tilesize; @@ -249,23 +250,9 @@ public class PowerNode extends PowerBlock{ x2 += t2.x; y2 += t2.y; - float space = Vector2.dst(x1, y1, x2, y2); - float scl = 4f, mag = 2f, tscl = 4f, segscl = 3f; - - int segments = Mathf.ceil(space / segscl); - - Draw.color(Palette.power, Palette.powerLight, Mathf.absin(Timers.time(), 5f, 1f)); - Lines.stroke(1f); - - for(int i = 0; i < segments; i++){ - float f1 = (float)i / segments; - float f2 = (float)(i+1) / segments; - t1.trns(angle1 + 90f, Mathf.lerp(Mathf.sin(tile.entity.id * 124f + Timers.time()/tscl + f1 * space, scl, mag), 0f, Math.abs(f1 - 0.5f)*2f)); - t2.trns(angle1 + 90f, Mathf.lerp(Mathf.sin(tile.entity.id * 124f + Timers.time()/tscl + f2 * space, scl, mag), 0f, Math.abs(f2 - 0.5f)*2f)); - - Lines.line(x1 + (x2 - x1) * f1 + t1.x, y1 + (y2 - y1) * f1 + t1.y, - x1 + (x2 - x1) * f2 + t2.x, y1 + (y2 - y1) * f2 + t2.y); - } + Draw.color(Palette.powerLight, Palette.power, Mathf.absin(Timers.time(), 8f, 1f)); + Lines.stroke(2f); + Lines.line(x1, y1, x2, y2); } } diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java b/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java index 69abb7d4c2..b3a7c6ef8d 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java @@ -74,7 +74,7 @@ public class Cultivator extends Drill{ Draw.color(bottomColor, plantColorLight, entity.warmup); - random.setSeed(tile.packedPosition()); + random.setSeed(tile.pos()); for(int i = 0; i < 12; i++){ float offset = random.nextFloat() * 999999f; float x = random.range(4f), y = random.range(4f); 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 591344afdb..33f98fd2ce 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java @@ -51,7 +51,6 @@ public class CoreBlock extends StorageBlock{ update = true; size = 3; hasItems = true; - itemCapacity = 2000; viewRange = 200f; flags = EnumSet.of(BlockFlag.resupplyPoint, BlockFlag.target); } @@ -83,8 +82,18 @@ public class CoreBlock extends StorageBlock{ if(entity != null) entity.solid = solid; } + @Override + public int getMaximumAccepted(Tile tile, Item item){ + return itemCapacity * state.teams.get(tile.getTeam()).cores.size; + } + @Override public void onProximityUpdate(Tile tile) { + for(Tile other : state.teams.get(tile.getTeam()).cores){ + if(other != tile){ + tile.entity.items = other.entity.items; + } + } state.teams.get(tile.getTeam()).cores.add(tile); } @@ -96,6 +105,11 @@ public class CoreBlock extends StorageBlock{ @Override public void removed(Tile tile){ state.teams.get(tile.getTeam()).cores.remove(tile); + + int max = itemCapacity * state.teams.get(tile.getTeam()).cores.size; + for(Item item : content.items()){ + tile.entity.items.set(item, Math.min(tile.entity.items.get(item), max)); + } } @Override @@ -222,7 +236,7 @@ public class CoreBlock extends StorageBlock{ return new CoreEntity(); } - public class CoreEntity extends StorageEntity implements SpawnerTrait{ + public class CoreEntity extends TileEntity implements SpawnerTrait{ public Unit currentUnit; int droneID = -1; boolean solid = true; diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/SortedUnloader.java b/core/src/io/anuke/mindustry/world/blocks/storage/SortedUnloader.java index dd7374536a..7db33b0cac 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/SortedUnloader.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/SortedUnloader.java @@ -7,6 +7,7 @@ import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.type.Item; +import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.SelectionTrait; import io.anuke.ucore.graphics.Draw; @@ -17,15 +18,37 @@ import java.io.DataOutput; import java.io.IOException; import static io.anuke.mindustry.Vars.content; +import static io.anuke.mindustry.Vars.threads; -public class SortedUnloader extends Unloader implements SelectionTrait{ +public class SortedUnloader extends Block implements SelectionTrait{ protected float speed = 1f; + protected final int timerUnload = timers++; + + private static Item lastItem; public SortedUnloader(String name){ super(name); + update = true; + solid = true; + health = 70; + hasItems = true; configurable = true; } + @Override + public boolean canDump(Tile tile, Tile to, Item item){ + Block block = to.target().block(); + return !(block instanceof StorageBlock); + } + + @Override + public void setBars(){} + + @Override + public void playerPlaced(Tile tile){ + threads.runDelay(() -> Call.setSortedUnloaderItem(null, tile, lastItem)); + } + @Remote(targets = Loc.both, called = Loc.both, forward = true) public static void setSortedUnloaderItem(Player player, Tile tile, Item item){ SortedUnloaderEntity entity = tile.entity(); @@ -65,7 +88,10 @@ public class SortedUnloader extends Unloader implements SelectionTrait{ @Override public void buildTable(Tile tile, Table table){ SortedUnloaderEntity entity = tile.entity(); - buildItemTable(table, true, () -> entity.sortItem, item -> Call.setSortedUnloaderItem(null, tile, item)); + buildItemTable(table, () -> entity.sortItem, item -> { + lastItem = item; + Call.setSortedUnloaderItem(null, tile, item); + }); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java b/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java index b6d2c738a9..324c86008a 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java @@ -1,20 +1,10 @@ package io.anuke.mindustry.world.blocks.storage; -import com.badlogic.gdx.graphics.Color; -import com.badlogic.gdx.utils.Array; import io.anuke.mindustry.entities.TileEntity; -import io.anuke.mindustry.entities.Unit; -import io.anuke.mindustry.graphics.Palette; -import io.anuke.mindustry.graphics.Shaders; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.BarType; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; -import io.anuke.ucore.core.Graphics; -import io.anuke.ucore.graphics.Draw; -import io.anuke.ucore.graphics.Fill; - -import static io.anuke.mindustry.Vars.tilesize; public abstract class StorageBlock extends Block{ @@ -23,6 +13,16 @@ public abstract class StorageBlock extends Block{ hasItems = true; } + @Override + public boolean acceptItem(Item item, Tile tile, Tile source){ + return tile.entity.items.get(item) < getMaximumAccepted(tile, item); + } + + @Override + public int getMaximumAccepted(Tile tile, Item item){ + return itemCapacity; + } + @Override public void setBars(){ super.setBars(); @@ -34,85 +34,6 @@ public abstract class StorageBlock extends Block{ return false; } - @Override - public void onProximityAdded(Tile tile){ - StorageEntity entity = tile.entity(); - entity.graph.set(tile); - - for(Tile prox : tile.entity.proximity()){ - if(prox.block() instanceof StorageBlock){ - StorageEntity other = prox.entity(); - entity.graph.merge(other.graph); - } - } - } - - @Override - public void onProximityRemoved(Tile tile){ - StorageEntity entity = tile.entity(); - entity.graph.remove(tile); - } - - @Override - public void drawSelect(Tile tile){ - - StorageEntity entity = tile.entity(); - - if(entity.graph.getTiles().size > 1){ - - Shaders.outline.color.set(Palette.accent); - Graphics.beginShaders(Shaders.outline); - - for(Tile other : entity.graph.getTiles()){ - Fill.square(other.drawx(), other.drawy(), other.block().size * tilesize); - } - - Draw.color(Color.CLEAR); - Graphics.endShaders(); - Draw.color(); - } - } - - @Override - public boolean acceptItem(Item item, Tile tile, Tile source){ - StorageEntity entity = tile.entity(); - return entity.graph.accept(item); - } - - @Override - public int acceptStack(Item item, int amount, Tile tile, Unit source){ - StorageEntity entity = tile.entity(); - if(acceptItem(item, tile, tile) && hasItems && (source == null || source.getTeam() == tile.getTeam())){ - return Math.min(entity.graph.accept(item, amount), amount); - }else{ - return 0; - } - } - - @Override - public float inventoryScaling(Tile tile){ - StorageEntity entity = tile.entity(); - return 1f / entity.graph.getTiles().size; - } - - @Override - public TileEntity newEntity(){ - return new StorageEntity(); - } - - @Override - public Array getDebugInfo(Tile tile){ - Array arr = super.getDebugInfo(tile); - - StorageEntity entity = tile.entity(); - arr.addAll("storage graph", entity.graph.getID(), - "graph capacity", entity.graph.getCapacity(), - "graph tiles", entity.graph.getTiles().size, - "graph item ID", entity.graph.items().getID()); - - return arr; - } - /** * Removes an item and returns it. If item is not null, it should return the item. * Returns null if no items are there. @@ -144,8 +65,4 @@ public abstract class StorageBlock extends Block{ return entity.items.has(item); } } - - public class StorageEntity extends TileEntity{ - public StorageGraph graph = new StorageGraph(); - } } diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/StorageGraph.java b/core/src/io/anuke/mindustry/world/blocks/storage/StorageGraph.java deleted file mode 100644 index d139f84693..0000000000 --- a/core/src/io/anuke/mindustry/world/blocks/storage/StorageGraph.java +++ /dev/null @@ -1,151 +0,0 @@ -package io.anuke.mindustry.world.blocks.storage; - -import com.badlogic.gdx.utils.IntSet; -import com.badlogic.gdx.utils.ObjectSet; -import com.badlogic.gdx.utils.Queue; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.storage.StorageBlock.StorageEntity; -import io.anuke.mindustry.world.modules.ItemModule; - -public class StorageGraph{ - private static IntSet closedSet = new IntSet(); - private static Queue queue = new Queue<>(); - private static ObjectSet itemSet = new ObjectSet<>(); - private static int lastID; - - private final int id = lastID++; - private ObjectSet tiles = new ObjectSet<>(); - private ItemModule items = new ItemModule(); - private int capacity; - - public void set(Tile tile){ - items.addAll(tile.entity.items); - items.setID(tile.entity.items.getID()); - - add(tile); - } - - public void add(Tile tile){ - - if(!tiles.add(tile)) return; - - StorageEntity e = tile.entity(); - e.graph = this; - - capacity += tile.block().itemCapacity; - - if(tile.entity.items != null && tile.entity.items.getID() != items.getID()){ - items.addAll(tile.entity.items); - } - - tile.entity.items = items; - } - - public void remove(Tile tile){ - if(!tiles.contains(tile)) return; - - for(Tile other : tiles){ - if(other == tile) continue; - - StorageEntity entity = other.entity(); - entity.graph = null; - entity.items = new ItemModule(); - - float fraction = (float)other.block().itemCapacity / capacity; - items.forEach((item, amount) -> { - int added = (int)(fraction * amount); - entity.items.add(item, added); - items.remove(item, added); - }); - } - - //handle remaining items that didn't get added - Item taken; - while((taken = items.take()) != null){ - for(Tile other : tiles){ - if(other == tile) continue; - - //insert item into first found block - if(other.entity.items.get(taken) < other.block().itemCapacity){ - other.entity.items.add(taken, 1); - break; - } - } - } - - items.clear(); - capacity = 0; - - for(Tile other : tile.entity.proximity()){ - if(other.block() instanceof StorageBlock && other.entity().graph == null){ - StorageGraph graph = new StorageGraph(); - other.entity().graph = graph; - graph.reflow(tile, other); - } - } - } - - public void reflow(Tile base, Tile tile){ - queue.clear(); - queue.addLast(tile); - closedSet.clear(); - itemSet.clear(); - - while(queue.size > 0){ - Tile child = queue.removeFirst(); - StorageEntity entity = child.entity(); - entity.graph = this; - - if(!itemSet.add(child.entity.items)) child.entity.items = null; - add(child); - - for(Tile next : child.entity.proximity()){ - if(next != base && next.block() instanceof StorageBlock && next.entity().graph == null && !closedSet.contains(next.packedPosition())){ - queue.addLast(next); - closedSet.add(next.packedPosition()); - } - } - } - } - - public void merge(StorageGraph other){ - if(this == other || other == null) return; - - itemSet.clear(); - for(Tile tile : other.tiles){ - if(!itemSet.add(tile.entity.items)){ - tile.entity.items = null; - } - } - - for(Tile tile : other.tiles){ - add(tile); - } - } - - public boolean accept(Item item){ - return accept(item, 1) == 1; - } - - public int accept(Item item, int amount){ - return Math.min(capacity - items.get(item), amount); - } - - public ObjectSet getTiles(){ - return tiles; - } - - public int getID(){ - return id; - } - - public int getCapacity(){ - return capacity; - } - - public ItemModule items(){ - return items; - } - -} diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java b/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java deleted file mode 100644 index c42c272985..0000000000 --- a/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.anuke.mindustry.world.blocks.storage; - -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.Tile; - -public abstract class Unloader extends Block{ - protected final int timerUnload = timers++; - - public Unloader(String name){ - super(name); - update = true; - solid = true; - health = 70; - hasItems = true; - } - - @Override - public boolean canDump(Tile tile, Tile to, Item item){ - Block block = to.target().block(); - return !(block instanceof StorageBlock); - } - - @Override - public void setBars(){} -} diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/Vault.java b/core/src/io/anuke/mindustry/world/blocks/storage/Vault.java index 28beaad8f2..4ee9cf97b7 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/Vault.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/Vault.java @@ -7,7 +7,6 @@ public class Vault extends StorageBlock{ solid = true; update = false; destructible = true; - itemCapacity = 1000; } } diff --git a/core/src/io/anuke/mindustry/world/blocks/units/Reconstructor.java b/core/src/io/anuke/mindustry/world/blocks/units/Reconstructor.java index 066f8584f2..128c962086 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/Reconstructor.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/Reconstructor.java @@ -62,7 +62,7 @@ public class Reconstructor extends Block{ if(other != null && other.block() instanceof Reconstructor){ ReconstructorEntity oe = other.entity(); - if(oe.link == entity.tile.packedPosition()){ + if(oe.link == entity.tile.pos()){ oe.link = -1; } } @@ -103,8 +103,8 @@ public class Reconstructor extends Block{ unlink(entity); unlink(oe); - entity.link = other.packedPosition(); - oe.link = tile.packedPosition(); + entity.link = other.pos(); + oe.link = tile.pos(); }); } @@ -161,7 +161,7 @@ public class Reconstructor extends Block{ ReconstructorEntity entity = tile.entity(); - if(entity.link == other.packedPosition()){ + if(entity.link == other.pos()){ Call.unlinkReconstructor(null, tile, other); return false; }else if(other.block() instanceof Reconstructor){ diff --git a/desktop/src/io/anuke/mindustry/desktop/DesktopPlatform.java b/desktop/src/io/anuke/mindustry/desktop/DesktopPlatform.java index d4cd5ad4e7..0604d62e53 100644 --- a/desktop/src/io/anuke/mindustry/desktop/DesktopPlatform.java +++ b/desktop/src/io/anuke/mindustry/desktop/DesktopPlatform.java @@ -60,7 +60,7 @@ public class DesktopPlatform extends Platform{ presence.largeImageText = "Wave " + state.wave; } - if(state.mode != GameMode.noWaves){ + if(state.mode != GameMode.attack){ presence.state = Strings.capitalize(state.mode.name()); }else{ presence.state = unitGroups[players[0].getTeam().ordinal()].size() == 1 ? "1 Unit Active" : diff --git a/kryonet/build.gradle b/kryonet/build.gradle index afd5e6ab73..57fced1dd2 100644 --- a/kryonet/build.gradle +++ b/kryonet/build.gradle @@ -1,4 +1,4 @@ apply plugin: "java" sourceCompatibility = 1.8 -sourceSets.main.java.srcDirs = [ "src/" ] +sourceSets.main.java.srcDirs = ["src/"] diff --git a/kryonet/src/io/anuke/kryonet/ByteSerializer.java b/kryonet/src/io/anuke/kryonet/ByteSerializer.java index c8155e458d..119a876658 100644 --- a/kryonet/src/io/anuke/kryonet/ByteSerializer.java +++ b/kryonet/src/io/anuke/kryonet/ByteSerializer.java @@ -10,18 +10,18 @@ import io.anuke.ucore.util.Pooling; import java.nio.ByteBuffer; @SuppressWarnings("unchecked") -public class ByteSerializer implements Serialization { +public class ByteSerializer implements Serialization{ @Override - public void write(ByteBuffer byteBuffer, Object o) { + public void write(ByteBuffer byteBuffer, Object o){ if(o instanceof FrameworkMessage){ - byteBuffer.put((byte)-2); //code for framework message - FrameworkSerializer.write(byteBuffer, (FrameworkMessage)o); - }else { - if (!(o instanceof Packet)) + byteBuffer.put((byte) -2); //code for framework message + FrameworkSerializer.write(byteBuffer, (FrameworkMessage) o); + }else{ + if(!(o instanceof Packet)) throw new RuntimeException("All sent objects must implement be Packets! Class: " + o.getClass()); byte id = Registrator.getID(o.getClass()); - if (id == -1) + if(id == -1) throw new RuntimeException("Unregistered class: " + o.getClass()); byteBuffer.put(id); ((Packet) o).write(byteBuffer); @@ -29,10 +29,10 @@ public class ByteSerializer implements Serialization { } @Override - public Object read(ByteBuffer byteBuffer) { + public Object read(ByteBuffer byteBuffer){ byte id = byteBuffer.get(); if(id == -2){ - return FrameworkSerializer.read(byteBuffer); + return FrameworkSerializer.read(byteBuffer); }else{ Packet packet = Pooling.obtain((Class) Registrator.getByID(id).type, (Supplier) Registrator.getByID(id).constructor); packet.read(byteBuffer); @@ -41,17 +41,17 @@ public class ByteSerializer implements Serialization { } @Override - public int getLengthLength() { + public int getLengthLength(){ return 2; } @Override - public void writeLength(ByteBuffer byteBuffer, int i) { - byteBuffer.putShort((short)i); + public void writeLength(ByteBuffer byteBuffer, int i){ + byteBuffer.putShort((short) i); } @Override - public int readLength(ByteBuffer byteBuffer) { + public int readLength(ByteBuffer byteBuffer){ return byteBuffer.getShort(); } } diff --git a/kryonet/src/io/anuke/kryonet/FrameworkSerializer.java b/kryonet/src/io/anuke/kryonet/FrameworkSerializer.java index 347f825855..9b95ccdf98 100644 --- a/kryonet/src/io/anuke/kryonet/FrameworkSerializer.java +++ b/kryonet/src/io/anuke/kryonet/FrameworkSerializer.java @@ -5,32 +5,32 @@ import com.esotericsoftware.kryonet.FrameworkMessage.*; import java.nio.ByteBuffer; -public class FrameworkSerializer { +public class FrameworkSerializer{ public static void write(ByteBuffer buffer, FrameworkMessage message){ if(message instanceof Ping){ - Ping p = (Ping)message; + Ping p = (Ping) message; - buffer.put((byte)0); + buffer.put((byte) 0); buffer.putInt(p.id); - buffer.put(p.isReply ? 1 : (byte)0); + buffer.put(p.isReply ? 1 : (byte) 0); }else if(message instanceof DiscoverHost){ - DiscoverHost p = (DiscoverHost)message; + DiscoverHost p = (DiscoverHost) message; - buffer.put((byte)1); + buffer.put((byte) 1); }else if(message instanceof KeepAlive){ - KeepAlive p = (KeepAlive)message; + KeepAlive p = (KeepAlive) message; - buffer.put((byte)2); + buffer.put((byte) 2); }else if(message instanceof RegisterUDP){ - RegisterUDP p = (RegisterUDP)message; + RegisterUDP p = (RegisterUDP) message; - buffer.put((byte)3); + buffer.put((byte) 3); buffer.putInt(p.connectionID); }else if(message instanceof RegisterTCP){ - RegisterTCP p = (RegisterTCP)message; + RegisterTCP p = (RegisterTCP) message; - buffer.put((byte)4); + buffer.put((byte) 4); buffer.putInt(p.connectionID); } } diff --git a/kryonet/src/io/anuke/kryonet/KryoClient.java b/kryonet/src/io/anuke/kryonet/KryoClient.java index 30e59bac14..abed5b9e2c 100644 --- a/kryonet/src/io/anuke/kryonet/KryoClient.java +++ b/kryonet/src/io/anuke/kryonet/KryoClient.java @@ -35,14 +35,14 @@ public class KryoClient implements ClientProvider{ public KryoClient(){ KryoCore.init(); - handler = new ClientDiscoveryHandler() { + handler = new ClientDiscoveryHandler(){ @Override - public DatagramPacket onRequestNewDatagramPacket() { + public DatagramPacket onRequestNewDatagramPacket(){ return new DatagramPacket(new byte[128], 128); } @Override - public void onDiscoveredHost(DatagramPacket datagramPacket) { + public void onDiscoveredHost(DatagramPacket datagramPacket){ ByteBuffer buffer = ByteBuffer.wrap(datagramPacket.getData()); Host host = NetworkIO.readServerData(datagramPacket.getAddress().getHostAddress(), buffer); for(InetAddress address : foundAddresses){ @@ -55,7 +55,7 @@ public class KryoClient implements ClientProvider{ } @Override - public void onFinally() { + public void onFinally(){ } }; @@ -65,7 +65,7 @@ public class KryoClient implements ClientProvider{ Listener listener = new Listener(){ @Override - public void connected (Connection connection) { + public void connected(Connection connection){ Connect c = new Connect(); c.addressTCP = connection.getRemoteAddressTCP().getAddress().getHostAddress(); c.id = connection.getID(); @@ -75,7 +75,7 @@ public class KryoClient implements ClientProvider{ } @Override - public void disconnected (Connection connection) { + public void disconnected(Connection connection){ if(connection.getLastProtocolError() != null){ netClient.setQuiet(); } @@ -85,13 +85,13 @@ public class KryoClient implements ClientProvider{ } @Override - public void received (Connection connection, Object object) { + public void received(Connection connection, Object object){ if(object instanceof FrameworkMessage) return; threads.runDelay(() -> { try{ Net.handleClientReceived(object); - }catch (Exception e){ + }catch(Exception e){ handleException(e); } }); @@ -106,12 +106,12 @@ public class KryoClient implements ClientProvider{ } } - private static boolean isLocal(InetAddress addr) { - if (addr.isAnyLocalAddress() || addr.isLoopbackAddress()) return true; + private static boolean isLocal(InetAddress addr){ + if(addr.isAnyLocalAddress() || addr.isLoopbackAddress()) return true; - try { + try{ return NetworkInterface.getByInetAddress(addr) != null; - } catch (Exception e) { + }catch(Exception e){ return false; } } @@ -150,12 +150,12 @@ public class KryoClient implements ClientProvider{ } @Override - public void disconnect() { + public void disconnect(){ client.close(); } @Override - public void send(Object object, SendMode mode) { + public void send(Object object, SendMode mode){ if(mode == SendMode.tcp){ client.sendTCP(object); }else{ @@ -166,12 +166,12 @@ public class KryoClient implements ClientProvider{ } @Override - public void updatePing() { + public void updatePing(){ client.updateReturnTripTime(); } @Override - public int getPing() { + public int getPing(){ return client.getReturnTripTime(); } @@ -218,7 +218,7 @@ public class KryoClient implements ClientProvider{ public void dispose(){ try{ client.dispose(); - }catch (IOException e){ + }catch(IOException e){ throw new RuntimeException(e); } } diff --git a/kryonet/src/io/anuke/kryonet/KryoCore.java b/kryonet/src/io/anuke/kryonet/KryoCore.java index 412fc1000b..01d582edc6 100644 --- a/kryonet/src/io/anuke/kryonet/KryoCore.java +++ b/kryonet/src/io/anuke/kryonet/KryoCore.java @@ -10,8 +10,8 @@ import java.util.concurrent.ScheduledExecutorService; import static io.anuke.mindustry.Vars.headless; -/**Utilities and configs for kryo module.*/ -public class KryoCore { +/** Utilities and configs for kryo module. */ +public class KryoCore{ public static boolean fakeLag = false; public static final int fakeLagMax = 500; public static final int fakeLagMin = 0; @@ -26,7 +26,7 @@ public class KryoCore { Log.set(fakeLag ? Log.LEVEL_DEBUG : Log.LEVEL_WARN); Log.setLogger(new Logger(){ - public void log (int level, String category, String message, Throwable ex) { + public void log(int level, String category, String message, Throwable ex){ if(fakeLag){ if(message.contains("UDP")){ lastUDP = true; @@ -45,7 +45,7 @@ public class KryoCore { builder.append(message); - if (ex != null) { + if(ex != null){ StringWriter writer = new StringWriter(256); ex.printStackTrace(new PrintWriter(writer)); builder.append('\n'); @@ -60,7 +60,7 @@ public class KryoCore { }); } - private static int calculateLag() { - return fakeLagMin + (int)(Math.random() * (fakeLagMax - fakeLagMin)); + private static int calculateLag(){ + return fakeLagMin + (int) (Math.random() * (fakeLagMax - fakeLagMin)); } } diff --git a/kryonet/src/io/anuke/kryonet/KryoServer.java b/kryonet/src/io/anuke/kryonet/KryoServer.java index 45269e42fb..83e8623f52 100644 --- a/kryonet/src/io/anuke/kryonet/KryoServer.java +++ b/kryonet/src/io/anuke/kryonet/KryoServer.java @@ -29,7 +29,7 @@ import java.util.concurrent.CopyOnWriteArraySet; import static io.anuke.mindustry.Vars.threads; -public class KryoServer implements ServerProvider { +public class KryoServer implements ServerProvider{ final Server server; final CopyOnWriteArrayList connections = new CopyOnWriteArrayList<>(); final CopyOnWriteArraySet missing = new CopyOnWriteArraySet<>(); @@ -42,7 +42,7 @@ public class KryoServer implements ServerProvider { public KryoServer(){ KryoCore.init(); - server = new Server(4096*2, 4096, connection -> new ByteSerializer()); + server = new Server(4096 * 2, 4096, connection -> new ByteSerializer()); server.setDiscoveryHandler((datagramChannel, fromAddress) -> { ByteBuffer buffer = NetworkIO.writeServerData(); buffer.position(0); @@ -53,32 +53,29 @@ public class KryoServer implements ServerProvider { Listener listener = new Listener(){ @Override - public void connected (Connection connection) { + public void connected(Connection connection){ String ip = connection.getRemoteAddressTCP().getAddress().getHostAddress(); - KryoConnection kn = new KryoConnection(lastconnection ++, ip, connection); + KryoConnection kn = new KryoConnection(lastconnection++, ip, connection); Connect c = new Connect(); c.id = kn.id; c.addressTCP = ip; - Log.info("&bRecieved connection: {0} / {1}. Kryonet ID: {2}", c.id, c.addressTCP, connection.getID()); + Log.info("&bRecieved connection: {0}", c.addressTCP); connections.add(kn); threads.runDelay(() -> Net.handleServerReceived(kn.id, c)); } @Override - public void disconnected (Connection connection) { + public void disconnected(Connection connection){ KryoConnection k = getByKryoID(connection.getID()); - Log.info("&bLost kryonet connection {0}", connection.getID()); if(k == null) return; Disconnect c = new Disconnect(); c.id = k.id; - Log.info("&bLost connection: {0}", k.id); - threads.runDelay(() -> { Net.handleServerReceived(k.id, c); connections.remove(k); @@ -86,14 +83,14 @@ public class KryoServer implements ServerProvider { } @Override - public void received (Connection connection, Object object) { + public void received(Connection connection, Object object){ KryoConnection k = getByKryoID(connection.getID()); if(object instanceof FrameworkMessage || k == null) return; threads.runDelay(() -> { try{ Net.handleServerReceived(k.id, object); - }catch (Exception e){ + }catch(Exception e){ e.printStackTrace(); } }); @@ -113,7 +110,7 @@ public class KryoServer implements ServerProvider { } @Override - public Array getConnections() { + public Array getConnections(){ array.clear(); for(KryoConnection c : connections){ array.add(c); @@ -123,7 +120,7 @@ public class KryoServer implements ServerProvider { @Override public KryoConnection getByID(int id){ - for(int i = 0; i < connections.size(); i ++){ + for(int i = 0; i < connections.size(); i++){ KryoConnection con = connections.get(i); if(con.id == id){ return con; @@ -134,7 +131,7 @@ public class KryoServer implements ServerProvider { } @Override - public void host(int port) throws IOException { + public void host(int port) throws IOException{ //attempt to open default ports if they're not already open //this only opens the default port due to security concerns (?) if(port == Vars.port){ @@ -142,7 +139,8 @@ public class KryoServer implements ServerProvider { try{ if(!UPnP.isMappedTCP(port)) UPnP.openPortTCP(port); if(!UPnP.isMappedUDP(port)) UPnP.openPortUDP(port); - }catch(Throwable ignored){} + }catch(Throwable ignored){ + } }); } @@ -154,7 +152,7 @@ public class KryoServer implements ServerProvider { serverThread = new Thread(() -> { try{ server.run(); - }catch (Throwable e){ + }catch(Throwable e){ if(!(e instanceof ClosedSelectorException)) handleException(e); } }, "Kryonet Server"); @@ -163,7 +161,7 @@ public class KryoServer implements ServerProvider { } @Override - public void close() { + public void close(){ connections.clear(); lastconnection = 0; @@ -171,17 +169,17 @@ public class KryoServer implements ServerProvider { } @Override - public void sendStream(int id, Streamable stream) { + public void sendStream(int id, Streamable stream){ KryoConnection connection = getByID(id); if(connection == null) return; - try { + try{ - if (connection.connection != null) { + if(connection.connection != null){ - connection.connection.addListener(new InputStreamSender(stream.stream, 512) { + connection.connection.addListener(new InputStreamSender(stream.stream, 512){ int id; - protected void start() { + protected void start(){ //send an object so the receiving side knows how to handle the following chunks StreamBegin begin = new StreamBegin(); begin.total = stream.stream.available(); @@ -190,14 +188,14 @@ public class KryoServer implements ServerProvider { id = begin.id; } - protected Object next(byte[] bytes) { + protected Object next(byte[] bytes){ StreamChunk chunk = new StreamChunk(); chunk.id = id; chunk.data = bytes; return chunk; //wrap the byte[] with an object so the receiving side knows how to handle it. } }); - } else { + }else{ int cid; StreamBegin begin = new StreamBegin(); begin.total = stream.stream.available(); @@ -205,7 +203,7 @@ public class KryoServer implements ServerProvider { connection.send(begin, SendMode.tcp); cid = begin.id; - while (stream.stream.available() > 0) { + while(stream.stream.available() > 0){ byte[] bytes = new byte[Math.min(512, stream.stream.available())]; stream.stream.read(bytes); @@ -215,20 +213,20 @@ public class KryoServer implements ServerProvider { connection.send(chunk, SendMode.tcp); } } - }catch (IOException e){ + }catch(IOException e){ throw new RuntimeException(e); } } @Override - public void send(Object object, SendMode mode) { - for(int i = 0; i < connections.size(); i ++){ + public void send(Object object, SendMode mode){ + for(int i = 0; i < connections.size(); i++){ connections.get(i).send(object, mode); } } @Override - public void sendTo(int id, Object object, SendMode mode) { + public void sendTo(int id, Object object, SendMode mode){ NetConnection conn = getByID(id); if(conn == null){ if(!missing.contains(id)) @@ -240,8 +238,8 @@ public class KryoServer implements ServerProvider { } @Override - public void sendExcept(int id, Object object, SendMode mode) { - for(int i = 0; i < connections.size(); i ++){ + public void sendExcept(int id, Object object, SendMode mode){ + for(int i = 0; i < connections.size(); i++){ KryoConnection conn = connections.get(i); if(conn.id != id) conn.send(object, mode); } @@ -254,11 +252,13 @@ public class KryoServer implements ServerProvider { } private void handleException(Throwable e){ - Timers.run(0f, () -> { throw new RuntimeException(e);}); + Timers.run(0f, () -> { + throw new RuntimeException(e); + }); } KryoConnection getByKryoID(int id){ - for(int i = 0; i < connections.size(); i ++){ + for(int i = 0; i < connections.size(); i++){ KryoConnection con = connections.get(i); if(con.connection != null && con.connection.getID() == id){ return con; @@ -277,7 +277,7 @@ public class KryoServer implements ServerProvider { class KryoConnection extends NetConnection{ public final Connection connection; - public KryoConnection(int id, String address, Connection connection) { + public KryoConnection(int id, String address, Connection connection){ super(id, address); this.connection = connection; } @@ -289,13 +289,13 @@ public class KryoServer implements ServerProvider { @Override public void send(Object object, SendMode mode){ - try { - if (mode == SendMode.tcp) { + try{ + if(mode == SendMode.tcp){ connection.sendTCP(object); - } else { + }else{ connection.sendUDP(object); } - }catch (Exception e){ + }catch(Exception e){ Log.err(e); Log.info("Disconnecting invalid client!"); connection.close(); diff --git a/tools/build.gradle b/tools/build.gradle index 876fa569c8..b7e87d5fb1 100644 --- a/tools/build.gradle +++ b/tools/build.gradle @@ -3,7 +3,6 @@ apply plugin: "java" sourceCompatibility = 1.8 sourceSets.main.java.srcDirs = [ "src/" ] - import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.tools.texturepacker.TexturePacker