From 7c073f76ae3afeb8e571ac83e463e9c2adbaa498 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 20 Nov 2018 19:28:26 -0500 Subject: [PATCH 01/32] Added automatic build incrementing --- build.gradle | 17 ++++++++++++++--- ios/robovm.properties | 3 ++- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 10d8492d99..34c50c44d9 100644 --- a/build.gradle +++ b/build.gradle @@ -110,17 +110,28 @@ project(":ios") { include "**/*.java" } - into "ios/src/io/anuke/mindustry/gen" + into "core/src/io/anuke/mindustry/gen" } doFirst{ delete{ - delete "ios/src/io/anuke/mindustry/gen/" + delete "core/src/io/anuke/mindustry/gen/" } } } - //build.dependsOn(copyGen) + task incrementConfig{ + def vfile = file('robovm.properties') + + def props = new Properties() + props.load(new FileInputStream(vfile)) + + props['app.build'] = (props['app.build'].toInteger() + 1)+"" + props.store(vfile.newWriter(), null) + } + + build.dependsOn(incrementConfig) + build.dependsOn(copyGen) dependencies { compile project(":core") diff --git a/ios/robovm.properties b/ios/robovm.properties index 694b9dfa68..c843b667a4 100644 --- a/ios/robovm.properties +++ b/ios/robovm.properties @@ -1,6 +1,7 @@ +#Tue Nov 20 19:26:13 EST 2018 app.version=4.0 app.id=io.anuke.mindustry app.mainclass=io.anuke.mindustry.IOSLauncher app.executable=IOSLauncher -app.build=27 +app.build=30 app.name=Mindustry From 46035e76cc48d080aa23f52a6f23656e4db3fcf0 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 21 Nov 2018 09:59:56 -0500 Subject: [PATCH 02/32] Build increment --- ios/robovm.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/robovm.properties b/ios/robovm.properties index c843b667a4..3bc8a2f6b5 100644 --- a/ios/robovm.properties +++ b/ios/robovm.properties @@ -1,7 +1,7 @@ -#Tue Nov 20 19:26:13 EST 2018 +#Tue Nov 20 20:02:17 EST 2018 app.version=4.0 app.id=io.anuke.mindustry app.mainclass=io.anuke.mindustry.IOSLauncher app.executable=IOSLauncher -app.build=30 +app.build=32 app.name=Mindustry From 729f5ed5e4f48cfe7000be9860ad12b5b4643074 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 21 Nov 2018 11:00:50 -0500 Subject: [PATCH 03/32] New version format / Updated bundles / ConnectPacket encoding fix --- build.gradle | 13 +- core/assets/bundles/bundle.properties | 1 - core/assets/bundles/bundle_de.properties | 4 +- core/assets/bundles/bundle_es.properties | 4 +- core/assets/bundles/bundle_fr.properties | 4 +- core/assets/bundles/bundle_fr_BE.properties | 4 +- core/assets/bundles/bundle_in_ID.properties | 4 +- core/assets/bundles/bundle_it.properties | 4 +- core/assets/bundles/bundle_ja.properties | 4 +- core/assets/bundles/bundle_ko.properties | 1557 ++++++++--------- core/assets/bundles/bundle_pl.properties | 4 +- core/assets/bundles/bundle_pt_BR.properties | 4 +- core/assets/bundles/bundle_ru.properties | 4 +- core/assets/bundles/bundle_tk.properties | 4 +- core/assets/bundles/bundle_tr.properties | 4 +- core/assets/bundles/bundle_uk_UA.properties | 4 +- core/assets/bundles/bundle_zh_CN.properties | 4 +- core/assets/bundles/bundle_zh_TW.properties | 4 +- core/src/io/anuke/mindustry/game/Version.java | 6 +- core/src/io/anuke/mindustry/net/Packets.java | 13 +- .../mindustry/ui/fragments/MenuFragment.java | 19 +- ios/build.gradle | 5 - ios/robovm.properties | 7 - 23 files changed, 824 insertions(+), 857 deletions(-) delete mode 100644 ios/robovm.properties diff --git a/build.gradle b/build.gradle index 34c50c44d9..5db17d98cc 100644 --- a/build.gradle +++ b/build.gradle @@ -19,7 +19,7 @@ allprojects { version = 'release' ext { - versionNumber = '4.0' + versionNumber = '4' versionModifier = 'alpha' versionType = 'official' appName = 'Mindustry' @@ -124,9 +124,16 @@ project(":ios") { def vfile = file('robovm.properties') def props = new Properties() - props.load(new FileInputStream(vfile)) + if(vfile.exists()){ + props.load(new FileInputStream(vfile)) + } - props['app.build'] = (props['app.build'].toInteger() + 1)+"" + props['app.id'] = 'io.anuke.mindustry' + props['app.version'] = '4.0' + 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.store(vfile.newWriter(), null) } diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 5c12a3f2d0..b1604578b9 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -362,7 +362,6 @@ setting.sensitivity.name = Controller Sensitivity setting.saveinterval.name = Autosave Interval setting.seconds = {0} Seconds setting.fullscreen.name = Fullscreen -setting.multithread.name = Multithreading setting.fps.name = Show FPS setting.vsync.name = VSync setting.lasers.name = Show Power Lasers diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index 3678908918..b5a0972fba 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -286,6 +286,7 @@ text.no = Nein text.info.title = [accent]Info text.error.title = [crimson] Ein Fehler ist aufgetreten text.error.crashtitle = Ein Fehler ist aufgetreten! +text.blocks.unknown = [LIGHT_GRAY]??? text.blocks.blockinfo = Blockinfo: text.blocks.powercapacity = Kapazität text.blocks.powershot = Stromverbrauch/Schuss @@ -359,7 +360,6 @@ setting.sensitivity.name = Controller-Empfindlichkeit setting.saveinterval.name = Autosave Häufigkeit setting.seconds = {0} Sekunden setting.fullscreen.name = Vollbild -setting.multithread.name = Multithreading setting.fps.name = Zeige FPS setting.vsync.name = VSync setting.lasers.name = Zeige Stromlaser @@ -404,8 +404,6 @@ mode.waves.name = Wellen mode.waves.description = Der normale Modus. Begrenzte Ressourcen und automatische Wellen. mode.sandbox.name = Sandkasten mode.sandbox.description = Unendliche Ressourcen und kein Timer für Wellen. -mode.custom.warning = [scarlet]FREISCHALTUNGEN IN BENUTZERDEFINIERTEN SPIELEN ODER SERVERN WERDEN NICHT GESPEICHERT.[]\n\nSpiele in Sektoren, um Dinge freizuschalten. -mode.custom.warning.read = Nur um sicherzugehen, dass du es gelesen hast:\n[scarlet]FREISCHALTUNGEN IN BENUTZERDEFINIERTEN SPIELEN ODER SERVERN WERDEN NICHT GESPEICHERT.[]\n\nSpiele in Sektoren, um Dinge freizuschalten.(Ich wünschte, der Hinweis wäre nicht notwendig, aber anscheinend ist er das)[] mode.freebuild.name = Freier Bau mode.freebuild.description = Begrenzte Ressourcen und kein Timer für Wellen. mode.pvp.name = PvP diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index d745f83d96..7d9362b2cd 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -286,6 +286,7 @@ text.no = No text.info.title = [accent]Información text.error.title = [crimson]Un error ha ocurrido. text.error.crashtitle = Un error ha ocurrido. +text.blocks.unknown = [LIGHT_GRAY]??? text.blocks.blockinfo = Información del Bloque text.blocks.powercapacity = Capacidad de Energía text.blocks.powershot = Energía/Disparo @@ -359,7 +360,6 @@ setting.sensitivity.name = Sensibilidad del Control setting.saveinterval.name = Intervalo del Auto-guardado setting.seconds = {0} Segundos setting.fullscreen.name = Pantalla Completa -setting.multithread.name = Multiproceso setting.fps.name = Mostrar FPS setting.vsync.name = VSync setting.lasers.name = Mostrar Energía de los Láseres @@ -404,8 +404,6 @@ mode.waves.name = hordas mode.waves.description = El modo normal. con recursos limitados y entrada de hordas automática. mode.sandbox.name = sandbox mode.sandbox.description = Recursos ilimitados y sin temporizador para las hordas. -mode.custom.warning = Ten en cuenta que los bloques no pueden usarse en partidas personalizadas hasta que se desbloqueen en sectores.\n\n[LIGHT_GRAY]Si no desbloqueaste ningún bloque, ningno aparecerá. -mode.custom.warning.read = Solo para asegurar que lo has leído:\n[scarlet]¡LOS DESBLOQUEOS EN PARTIDAS PERSONALIZADAS NO ESTÁN DISPONIBLES EN LOS SECTORES U OTROS MODOS DE JUEGO!\n\n[LIGHT_GRAY](Ojalá esto no fuera necesario, pero parece que lo es) mode.freebuild.name = construcción libre mode.freebuild.description = recursos limitados y no hay temporizador para las hordas. mode.pvp.name = PvP diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index ae82c370fd..a65e1aa21c 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -286,6 +286,7 @@ text.no = Non text.info.title = Info text.error.title = [crimson]Une erreur s'est produite text.error.crashtitle = Une erreur s'est produite +text.blocks.unknown = [LIGHT_GRAY]??? text.blocks.blockinfo = Info sur le bloc text.blocks.powercapacity = capacité d'énergie text.blocks.powershot = Énergie/Tir @@ -359,7 +360,6 @@ setting.sensitivity.name = Sensibilité de la manette setting.saveinterval.name = Intervalle des sauvegardes auto setting.seconds = {0} secondes setting.fullscreen.name = Plein écran -setting.multithread.name = Multithreading [scarlet] (instable!) setting.fps.name = Afficher FPS setting.vsync.name = VSync setting.lasers.name = Afficher les rayons des lasers @@ -404,8 +404,6 @@ mode.waves.name = Vagues mode.waves.description = le mode de jeu normal. Ressource limitée et vagues d'ennemis. mode.sandbox.name = bac à sable mode.sandbox.description = Ressources infinies et pas de timer pour les vagues. -mode.custom.warning = Notez que les blocs débloqués en partie personnalisées ne sont pas conservés pour les secteurs.\n\n[LIGHT_GRAY]En mode bac à sable, seul les blocs débloqués en mode secteur peuvent être utilisés. -mode.custom.warning.read = Simplement pour vérifier que vous l'avez lu :\n[scarlet]CE QUI EST DEBLOQUE LORS DES PARITES PERSONNALISEES NE L'EST POUR LES SECTEURS OU LES AUTRES MODES DE JEU!\n\n[LIGHT_GRAY](J'aurais souhaité que ce ne soit pas nécessaire, mais ça a l'air de l'être ) mode.freebuild.name = construction libre mode.freebuild.description = Ressource limitée et pas de timer pour les vagues. mode.pvp.name = JcJ diff --git a/core/assets/bundles/bundle_fr_BE.properties b/core/assets/bundles/bundle_fr_BE.properties index d35b767406..e8f1664d86 100644 --- a/core/assets/bundles/bundle_fr_BE.properties +++ b/core/assets/bundles/bundle_fr_BE.properties @@ -286,6 +286,7 @@ text.no = Non text.info.title = Info text.error.title = [crimson]Une erreur s'est produite text.error.crashtitle = Une erreur s'est produite +text.blocks.unknown = [LIGHT_GRAY]??? text.blocks.blockinfo = Info sur le bloc text.blocks.powercapacity = Capacité d'énergie text.blocks.powershot = Énergie/Tir @@ -359,7 +360,6 @@ setting.sensitivity.name = Contôle de la sensibilité setting.saveinterval.name = Intervalle des sauvegardes auto setting.seconds = {0} Secondes setting.fullscreen.name = Plein écran -setting.multithread.name = Multithreading setting.fps.name = Afficher FPS setting.vsync.name = VSync setting.lasers.name = Afficher les rayons des lasers @@ -404,8 +404,6 @@ mode.waves.name = Vagues mode.waves.description = Le mode normal. Ressources limitées et vagues déclenchées automatiquement. mode.sandbox.name = Bac à sable mode.sandbox.description = Ressources infinies et pas de compte à rebours pour les vagues. -mode.custom.warning = Notez que les blocs débloqués en partie personnalisées ne sont pas conservés pour les secteurs.\n\n[LIGHT_GRAY]En mode bac à sable, seul les blocs débloqués en mode secteur peuvent être utilisés. -mode.custom.warning.read = Juste pour vous assurer que vous l'avez lu:\n[scarlet]Les déverrouillages dans les jeux personnalisés ne sont pas transférés aux secteurs ou à d'autres modes!\n\n[LIGHT_GRAY](J'aimerais que ce ne soit pas nécessaire, mais apparemment c'est le cas) mode.freebuild.name = Construction libre mode.freebuild.description = Ressources limitées et pas de compte à rebours pour les vagues. mode.pvp.name = PvP diff --git a/core/assets/bundles/bundle_in_ID.properties b/core/assets/bundles/bundle_in_ID.properties index fe9cf095c1..87704d767b 100644 --- a/core/assets/bundles/bundle_in_ID.properties +++ b/core/assets/bundles/bundle_in_ID.properties @@ -286,6 +286,7 @@ text.no = No text.info.title = [accent]Info text.error.title = [crimson]Telah terjadi kesalahan text.error.crashtitle = Telah terjadi kesalahan +text.blocks.unknown = [LIGHT_GRAY]??? text.blocks.blockinfo = Info Blok text.blocks.powercapacity = Kapasitas Tenaga text.blocks.powershot = Tenaga/tembakan @@ -359,7 +360,6 @@ setting.sensitivity.name = Sensitivitas Pengendali setting.saveinterval.name = Waktu Simpan Otomatis setting.seconds = {0} Detik setting.fullscreen.name = Layar Penuh -setting.multithread.name = Multithreading setting.fps.name = Tunjukkan FPS setting.vsync.name = VSync setting.lasers.name = Tampilkan Laser Tenaga @@ -404,8 +404,6 @@ mode.waves.name = gelombang 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.custom.warning = Note that blocks cannot be used in custom games until they are unlocked in sectors.\n\n[LIGHT_GRAY]If you have not unlocked any blocks, none will appear. -mode.custom.warning.read = Just to make sure you've read it:\n[scarlet]UNLOCKS IN CUSTOM GAMES DO NOT CARRY OVER TO SECTORS OR OTHER MODES!\n\n[LIGHT_GRAY](I wish this wasn't necessary, but apparently it is) mode.freebuild.name = freebuild mode.freebuild.description = limited resources and no timer for waves. mode.pvp.name = PvP diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index 1001b8369c..2ed037b43d 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -286,6 +286,7 @@ text.no = No text.info.title = [accent] Info text.error.title = [crimson]Si è verificato un errore text.error.crashtitle = Si è verificato un errore +text.blocks.unknown = [LIGHT_GRAY]??? text.blocks.blockinfo = info sul blocco text.blocks.powercapacity = Capacità Energetica text.blocks.powershot = Danno/Colpo @@ -359,7 +360,6 @@ setting.sensitivity.name = Sensibilità del controller setting.saveinterval.name = Intervallo di salvataggio automatico setting.seconds = {0} Secondi setting.fullscreen.name = Schermo Intero -setting.multithread.name = multithreading setting.fps.name = Mostra FPS setting.vsync.name = VSync setting.lasers.name = Mostra Laser Energetici @@ -404,8 +404,6 @@ mode.waves.name = ondate mode.waves.description = modalità normale. risorse limitate e ondate automatiche. mode.sandbox.name = Sandbox mode.sandbox.description = risorse infinite e nessun timer per le ondate. -mode.custom.warning = Note that blocks cannot be used in custom games until they are unlocked in sectors.\n\n[LIGHT_GRAY]If you have not unlocked any blocks, none will appear. -mode.custom.warning.read = Just to make sure you've read it:\n[scarlet]UNLOCKS IN CUSTOM GAMES DO NOT CARRY OVER TO SECTORS OR OTHER MODES!\n\n[LIGHT_GRAY](I wish this wasn't necessary, but apparently it is) mode.freebuild.name = freebuild mode.freebuild.description = risorse limitate e nessun timer per le ondate. mode.pvp.name = PvP diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index 109bd62369..e2308591e7 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -286,6 +286,7 @@ text.no = いいえ text.info.title = 情報 text.error.title = [crimson]エラーが発生しました text.error.crashtitle = エラーが発生しました +text.blocks.unknown = [LIGHT_GRAY]??? text.blocks.blockinfo = ブロック情報 text.blocks.powercapacity = 電力容量 text.blocks.powershot = 電力/ショット @@ -359,7 +360,6 @@ setting.sensitivity.name = 操作感度 setting.saveinterval.name = 自動保存間隔 setting.seconds = {0} 秒 setting.fullscreen.name = フルスクリーン -setting.multithread.name = マルチスレッド setting.fps.name = FPSを表示 setting.vsync.name = VSync setting.lasers.name = 電力レーザーを表示 @@ -404,8 +404,6 @@ mode.waves.name = ウェーブ mode.waves.description = ノーマルモードです。限られた資源でウェーブが自動的に始まります。 mode.sandbox.name = サンドボックス mode.sandbox.description = 無限の資源でウェーブを自由に始められます。 -mode.custom.warning = [scarlet]カスタムゲームまたは、サーバ内でのアンロックは保存されません。[]\n\nアンロックするには区域でプレイしてください。 -mode.custom.warning.read = 必ずお読みください:\n[scarlet]カスタムゲーム内でのアンロックは区域やほかのモードには影響しません!\n\n[LIGHT_GRAY](多分必要ないと思いますが) mode.freebuild.name = フリービルド mode.freebuild.description = 限られた資源でウェーブを自由に始められます。 mode.pvp.name = PvP diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index 402732502c..fd7bdcd8af 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -1,779 +1,778 @@ -text.credits.text=Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GRAY](In case you can't tell, this text is currently unfinished.\nTranslators, don't edit it yet!) -text.credits=제작자 -text.discord=Mindustry Discord 에 참여하세요! -text.link.discord.description=공식 Mindustry Discord 채팅방 -text.link.github.description=게임 소스코드 -text.link.dev-builds.description=개발중인 빌드 -text.link.trello.description=다음 출시될 기능들을 게시한 공식 Trello 보드 -text.link.itch.io.description=PC 버전 다운로드와 HTML5 버전이 있는 itch.io 사이트 -text.link.google-play.description=Google Play 스토어 정보 -text.link.wiki.description=공식 Mindustry 위키 (영어) -text.linkfail=링크를 여는데 실패했습니다! URL이 기기의 클립보드에 복사되었습니다. -text.gameover=코어가 터졌습니다. 게임 오버! -text.gameover.pvp=[accent]{0}[] 팀이 승리했습니다! -text.sector.gameover=이 지역을 공략하는데 실패했습니다. 포기 하시겠습니까? -text.sector.retry=아니오 -text.highscore=[YELLOW]최고점수 달성! -text.wave.lasted=[accent]{0}[] 까지 버티셨습니다. -text.level.highscore=최고 점수 : [accent]{0} -text.level.delete.title=삭제 확인 -text.map.delete=정말로 "[accent]{0}[]" 맵을 삭제하시겠습니까? -text.level.select=맵 선택 -text.level.mode=게임모드 : -text.construction.desktop=PC 에서의 조작 방법이 변경되었습니다.\n블록 선택을 해제하거나 건설을 중지하려면 [accent]스페이스 바[]를 누르세요. -text.construction.title=블록 배치 안내서 -text.construction=[accent]블록 배치 모드[]를 선택하셨습니다.\n\n블록을 설치하고 싶으면, 자신의 건설 가능 범위 내에서 간단히 탭 하면 됩니다.\n일부 블록을 선택한 후에 확인 버튼을 누르면 배가 배치 작업을 진행할 것입니다.\n\n- [accent]블록을 삭제[]하고 싶다면 배치하고 싶은 영역을 탭 하세요. \n- [accent]블록을 넓게 배치[]하고 싶다면 배치하고 싶은 시작 영역을 길게 누르며 드래그 하면 됩니다.\n- [accent]블록을 한줄로 배치[]하고 싶다면 배치하고 싶은 시작 영역을 한번 탭 하고 길게 누르면서 드래그 하면 됩니다. \n- [accent]블록 배치 모드를 취소[]하고 싶다면 화면 하단 왼쪽에 있는 X 버튼을 누르면 됩니다. -text.deconstruction.title=블록 삭제 안내서 -text.deconstruction=[accent]블록 삭제 모드[]를 선택하셨습니다\n\n블록을 삭제하고 싶다면, 자신의 건설 가능 범위 내에서 간단히 탭 하면 됩니다.\n일부 블록을 선택한 후에 확인 버튼을 누르면 배가 파괴 작업을 진행할 것입니다.\n\n- [accent]블록을 삭제[]하고 싶다면 배치하고 싶은 영역을 탭 하세요\n- [accent]블록을 넓은 범위로 삭제[]하고 싶다면 배치하고 싶은 시작 영역을 길게 누르며 드래그 하면 됩니다.\n- [accent]블록 삭제 모드를 취소[]하고 싶다면 화면 하단 왼쪽에 있는 X 버튼을 누르면 됩니다. -text.showagain=다음 세션에서 이 메세지를 표시하지 않습니다 -text.coreattack=< 코어가 공격받고 있습니다! > -text.unlocks=아이템들 -text.savegame=게임 저장 -text.loadgame=게임 불러오기 -text.joingame=멀티플레이 -text.addplayers=플레이어 추가/제거 -text.customgame=커스텀 게임 -text.sectors=지역 플레이 -text.sector=지역 : [LIGHT_GRAY]{0} -text.sector.time=시간 : [LIGHT_GRAY]{0} -text.sector.deploy=시작 -text.sector.abandon=초기화 -text.sector.abandon.confirm=정말로 이 지역의 모든 진행상황을 초기화 하겠습니까?\n이 작업은 되돌릴 수 없습니다! -text.sector.resume=계속하기 -text.sector.locked=[scarlet][[완료안됨] -text.sector.unexplored=[accent][[탐색안됨] -text.missions=목표 : [LIGHT_GRAY] {0} -text.mission=목표 : [LIGHT_GRAY] {0} -text.mission.main=주요 목표 : [LIGHT_GRAY]{0} -text.mission.info=미션 정보 -text.mission.complete=미션 성공! -text.mission.complete.body=지역 {0},{1} 클리어. -text.mission.wave=[accent]{0}/{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}개 수집 -text.mission.resource={0} 을(를) 수집하세요\n[accent]{1}/{2} -text.mission.block={0} 를 만드세요 -text.mission.unit={0} 유닛을 만드세요 -text.mission.command=유닛에게 {0} 명령을 보내세요 -text.mission.linknode=전력 노드를 연결하세요 -text.mission.display=[accent]목표 : [LIGHT_GRAY]{0} -text.mission.mech=[accent]{0}[] 기체로 바꾸세요 -text.mission.create=[accent]{0}[] 을(를)설치하세요. -text.none=<없음> -text.close=닫기 -text.quit=나가기 -text.maps=맵 -text.continue=계속하기 -text.nextmission=다음 임무 -text.maps.none=[LIGHT_GRAY]맵을 찾을 수 없습니다! -text.about.button=정보 -text.name=이름 : -text.filename=파일 이름 : -text.unlocked=새 블록 잠금 해제됨 -text.unlocked.plural=잠금 해제 -text.players=현재 {0}명 접속중 -text.players.single=현재 {0}명만 있음. -text.server.closing=[accent]서버 닫는중... -text.server.kicked.kick=서버에서 추방되었습니다! -text.server.kicked.serverClose=서버 종료됨. -text.server.kicked.sectorComplete=지역 클리어. -text.server.kicked.sectorComplete.text=임무 성공.\n서버가 다음지역 맵으로 이동되었습니다. -text.server.kicked.clientOutdated=오래된 버전의 클라이언트 입니다! 게임을 업데이트 하세요! -text.server.kicked.serverOutdated=오래된 버전의 서버입니다! 서버 호스트 관리자에게 문의하세요! -text.server.kicked.banned=뭘 하셨는지는 모르겠지만, 이제 영원히 서버에 접속할 수 없습니다. -text.server.kicked.recentKick=방금 추방처리 되었습니다. 잠시 기다린 후에 접속 해 주세요. -text.server.kicked.nameInUse=이 닉네임이 이미 서버에서 사용중입니다. -text.server.kicked.nameEmpty=닉네임에는 반드시 영어 또는 숫자가 있어야 합니다. -text.server.kicked.idInUse=이미 서버에 접속중입니다! 다중 계정은 허용되지 않습니다. -text.server.kicked.customClient=이 서버는 직접 빌드한 버전을 지원하지 않습니다. 공식 버전을 사용하세요. -text.host.info=[accent]호스트[] 버튼은 현재 네트워크의 [scarlet]6567[] 포트를 사용합니다.\n[LIGHY_GRAY]같은 Wi-Fi 또는 로컬 네트워크[] 에서 서버 목록을 볼 수 있습니다.\n\n만약 플레이어들이 이 IP를 통해 어디에서나 연결할 수 있게 하고 싶다면, 공유기 설정에서 [accent]포트 포워딩[]을 해야 합니다.\n\n[LIGHT_GRAY]참고 : LAN 게임 연결에 문제가 있는 사람이 있다면, 방화벽 설정에서 Mindustry 가 로컬 네트워크에 액세스하도록 허용했는지 확인 해 주세요. -text.join.info=여기서 [accent]서버 IP[]를 입력하여 다른 서버에 접속할 수 있습니다.\n또는 [accent]로컬 네트워크(LAN)[] 서버를 검색하여 접속할 수 있습니다.\nLAN 및 WAN 멀티 플레이어 모두 지원됩니다.\n\n[LIGHT_GRAY]참고:여기에서는 자동으로 글로벌 서버를 추가하지 않습니다. IP로 다른 사람의 서버에 접속할려면 서버장에게 IP를 요청해야 합니다. -text.hostserver=서버 열기 -text.hostserver.mobile=서버\n열기 -text.host=서버 열기 -text.hosting=[accent]서버 여는중... -text.hosts.refresh=새로고침 -text.hosts.discovering=LAN 게임 찾기 -text.server.refreshing=서버 목록 새로고치는중... -text.hosts.none=[lightgray]LAN 게임을 찾을 수 없습니다! -text.host.invalid=[scarlet]서버에 연결할 수 없습니다! -text.trace=플레이어 정보 보기 -text.trace.playername=이름 : [accent]{0} -text.trace.ip=IP : [accent]{0} -text.trace.id=고유 ID : [accent]{0} -text.trace.android=Android 클라이언트 : [accent]{0} -text.trace.modclient=수정된 클라이언트 : [accent]{0} -text.trace.totalblocksbroken=총 블록 파괴 개수 : [accent]{0} -text.trace.structureblocksbroken=구조 블록 파괴 수 : [accent]{0} -text.trace.lastblockbroken=마지막으로 파괴한 블록 : [accent]{0} -text.trace.totalblocksplaced=총 설치한 블록 개수 : [accent]{0} -text.trace.lastblockplaced=마지막으로 설치한 블록 : [accent]{0} -text.invalidid=잘못된 클라이언트 ID 입니다! 공식 Mindustry Discord 으로 버그 보고서를 제출 해 주세요. -text.server.bans=차단된 유저 -text.server.bans.none=차단된 플레이어가 없습니다. -text.server.admins=관리자 -text.server.admins.none=관리자가 없습니다! -text.server.add=서버 추가 -text.server.delete=이 서버를 삭제 하시겠습니까? -text.server.hostname=호스트 : {0} -text.server.edit=서버 수정 -text.server.outdated=[crimson]서버 버전이 낮습니다![] -text.server.outdated.client=[Crimson]클라이언트 버전이 낮습니다![] -text.server.version=[lightgray]서버 버전 : {0} -text.server.custombuild=[yellow]커스텀 서버 -text.confirmban=이 플레이어를 차단하시겠습니까? -text.confirmkick=정말로 이 플레이어를 추방시키겠습니까? -text.confirmunban=이 플레이어를 차단해제 하시겠습니까? -text.confirmadmin=이 플레이어를 관리자로 만들겠습니까? -text.confirmunadmin=이 플레이어를 일반 유저로 만들겠습니까? -text.joingame.title=게임 참가 -text.joingame.ip=IP : -text.disconnect=서버와 연결이 해제되었습니다. -text.disconnect.data=맵 데이터를 받아오는데 실패했습니다. -text.connecting=[accent]연결중... -text.connecting.data=[accent]맵 데이터 다운로드중... -text.server.port=포트 : -text.server.addressinuse=이 주소는 이미 사용중입니다! -text.server.invalidport=포트 번호가 잘못되었습니다. -text.server.error=[crimson]{0}[accent]서버를 여는데 오류가 발생했습니다.[] -text.save.old=이 저장파일은 이전 버전의 게임용이며, 지금은 사용할 수 없습니다. \n\n[LIGHT_GRAY]4.0 정식때 이전 게임버전에서 만든 저장파일과 호환됩니다. -text.save.new=새로 저장 -text.save.overwrite=이 저장 슬롯을 덮어씌우겠습니까? -text.overwrite=덮어쓰기 -text.save.none=저장 파일을 찾지 못했습니다! -text.saveload=[accent]저장중... -text.savefail=게임을 저장하지 못했습니다! -text.save.delete.confirm=이 저장파일을 삭제 하시겠습니까? -text.save.delete=삭제 -text.save.export=저장파일 내보내기 -text.save.import.invalid=[accent]파일이 잘못되었습니다! -text.save.import.fail=[crimson]저장파일을 불러오지 못함 : [accent]{0} -text.save.export.fail=[crimson]저장파일을 내보내지 못함 : [accent]{0} -text.save.import=저장파일 불러오기 -text.save.newslot=저장 파일이름 : -text.save.rename=이름 변경 -text.save.rename.text=새 이름 : -text.selectslot=저장슬롯을 선택하십시오. -text.slot=[accent]{0}번째 슬롯 -text.save.corrupted=[accent]세이브 파일이 손상되었거나 잘못된 파일입니다! 만약 게임을 업데이트 했다면 이것은 아마 저장 형식 변경일 것이고, 이것은 버그가 [scarlet]아닙니다[]. -text.sector.corrupted=[accent]저장 파일에서 지역을 발견했으나 불러오지 못했습니다.\n새로 생성되었습니다. -text.empty=<비어있음> -text.on=켜기 -text.off=끄기 -text.save.autosave=자동저장 : {0} -text.save.map=맵 : {0} -text.save.wave={0}단계[] -text.save.difficulty=난이도 : {0} -text.save.date=마지막 저장날짜 : {0} -text.save.playtime=플레이시간 : {0} -text.confirm=확인 -text.delete=삭제 -text.ok=확인 -text.open=열기 -text.cancel=취소 -text.openlink=링크 열기 -text.copylink=링크 복사 -text.back=뒤로가기 -text.quit.confirm=정말로 종료하시겠습니까? -text.changelog.title=변경사항 -text.changelog.loading=변경사항 가져오는중... -text.changelog.error.android=[accent]게임 변경사항은 가끔 Android 4.4 이하에서 작동하지 않습니다. 이것은 내부 Android 버그 때문입니다. -text.changelog.error.ios=[accent]현재 iOS에서는 변경 사항을 지원하지 않습니다. -text.changelog.error=[scarlet]게임 변경사항을 가져오는 중 오류가 발생했습니다![]\n인터넷 연결을 확인하십시오. -text.changelog.current=[accent][[현재 버전] -text.changelog.latest=[accent][[최신 버전] -text.loading=[accent]불러오는중... -text.saving=[accent]저장중... -text.wave=[accent]{0}단계 -text.wave.waiting=남은 시간 : [green]{0}초[] -text.waiting=[LIGHT_GRAY]대기중... -text.waiting.players=다른 플레이어를 기다리는 중.. -text.wave.enemies=[LIGHT_GRAY]{0} 마리 남았음 -text.wave.enemy=[LIGHT_GRAY]{0} 마리 남음 -text.loadimage=사진 불러오기 -text.saveimage=사진 저장 -text.unknown=알 수 없음 -text.custom=커스텀 -text.builtin=기본맵 -text.map.delete.confirm=이 맵을 삭제하시겠습니까? 이 명령은 취소할 수 없습니다! -text.map.random=[accent]랜덤 맵 -text.map.nospawn=이 맵에 플레이어가 스폰 할 코어가 없습니다! 맵 편집기에서 [ROYAL]파란색[]코어를 맵에 추가하세요. -text.map.nospawn.pvp=이 맵에는 적팀 코어가 없습니다! 에디터에서 [scarlet]빨간팀[] 코어를 추가하세요. -text.map.invalid=파일이 잘못되었거나 손상되어 맵을 열 수 없습니다. -text.editor.brush=브러쉬 -text.editor.slope=\\ -text.editor.openin=편집기 열기 -text.editor.oregen=광물 무작위 생성 -text.editor.oregen.info=광물 무작위 생성 : -text.editor.mapinfo=맵 정보 -text.editor.author=만든이 : -text.editor.description=설명 : -text.editor.name=이름 : -text.editor.teams=팀 -text.editor.elevation=지형 높이 -text.editor.errorimageload=[accent]{0}[] 파일을 불러오는데 오류가 발생했습니다. -text.editor.errorimagesave=[accent]{0}[] 파일 저장중 오류가 발생했습니다. -text.editor.generate=생성 -text.editor.resize=맵 크기조정 -text.editor.loadmap=맵 불러오기 -text.editor.savemap=맵 저장 -text.editor.saved=저장됨! -text.editor.save.noname=지도에 이름이 없습니다! 메뉴 -> '맵 정보' 에서 설정하세요. -text.editor.save.overwrite=이 맵의 이름은 기존에 있던 맵을 덮어씁니다! '맵 정보' 메뉴에서 다른 이름을 선택하세요. -text.editor.import.exists=[scarlet]맵을 불러올 수 없음 : [] 기존에 있던 '{0}' 맵이 이미 존재합니다! -text.editor.import=가져오기 -text.editor.importmap=맵 가져오기 -text.editor.importmap.description=이미 존재하는 맵 가져오기 -text.editor.importfile=파일 가져오기 -text.editor.importfile.description=외부 맵 파일 가져오기 -text.editor.importimage=지형 사진 가져오기 -text.editor.importimage.description=외부 맵 이미지 파일 가져오기 -text.editor.export=내보내기 -text.editor.exportfile=파일 내보내기 -text.editor.exportfile.description=맵 파일 내보내기 -text.editor.exportimage=지형 이미지 내보내기 -text.editor.exportimage.description=맵 이미지 파일 내보내기 -text.editor.loadimage=지형 가져오기 -text.editor.saveimage=지형 내보내기 -text.editor.unsaved=[scarlet]변경사항을 저장하지 않았습니다![]\n정말로 나가시겠습니까? -text.editor.resizemap=맵 크기 조정 -text.editor.mapname=맵 이름 : -text.editor.overwrite=[accept]경고!이 명령은 기존 맵을 덮어씌우게 됩니다. -text.editor.overwrite.confirm=[scarlet]경고![] 이 이름을 가진 맵이 이미 있습니다. 덮어 쓰시겠습니까? -text.editor.selectmap=불러올 맵 선택 : -text.width=넓이 : -text.height=높이 : -text.menu=메뉴 -text.play=플레이 -text.load=불러오기 -text.save=저장 -text.fps={0}FPS -text.tps={0}TPS -text.ping=ping : {0}ms -text.language.restart=언어를 변경하려면 게임을 다시시작 해 주세요. -text.settings=설정 -text.tutorial=게임 방법 -text.editor=편집기 -text.mapeditor=맵 편집기 -text.donate=기부 -text.connectfail=[crimson]{0}[accent] 서버에 연결하지 못했습니다.[] -text.error.unreachable=서버에 연결하지 못했습니다. -text.error.invalidaddress=잘못된 주소입니다. -text.error.timedout=시간 초과!\n서버에 포트 포워딩이 설정되어 있고 주소가 올바른지 확인하십시오. -text.error.mismatch=패킷 오류:\n클라이언트/서버 버전이 일치하지 않습니다.\n접속할려는 서버가 최신 버전의 Mindustry 인지 확인하세요! -text.error.alreadyconnected=이미 접속중입니다. -text.error.mapnotfound=맵 파일을 찾을 수 없습니다! -text.error.any=알 수 없는 네트워크 오류. -text.settings.language=언어 -text.settings.reset=설정 초기화 -text.settings.rebind=키 재설정 -text.settings.controls=컨트롤 -text.settings.game=게임 -text.settings.sound=소리 -text.settings.graphics=그래픽 -text.settings.cleardata=게임 데이터 초기화... -text.settings.clear.confirm=정말로 초기화 하겠습니까?\n이 작업을 되돌릴 수 없습니다! -text.settings.clearall.confirm=[scarlet]경고![]\n이 작업은 저장된 맵, 맵파일, 잠금 해제된 목록과 키 매핑, 그리고 모든 데이터를 삭제합니다.\n확인 버튼을 다시 눌러 모든 데이터를 삭제하고 게임에서 나갑니다. -text.settings.clearsectors=지역 초기화 -text.settings.clearunlocks=잠금 해제 초기화 -text.settings.clearall=모두 초기화 -text.paused=일시 정지 -text.yes=예 -text.no=아니오 -text.info.title=[accent]정보 -text.error.title=[crimson]오류가 발생했습니다. -text.error.crashtitle=오류가 발생했습니다. -text.blocks.unknown=[LIGHT_GRAY]??? -text.blocks.blockinfo=블록 정보 -text.blocks.powercapacity=최대 전력 용량 -text.blocks.powershot=1발당 전력 소모량 -text.blocks.targetsair=공중공격 가능 -text.blocks.itemspeed=유닛 이동 속도 -text.blocks.shootrange=사거리 -text.blocks.size=블록 크기 -text.blocks.liquidcapacity=최대 액체 용량 -text.blocks.maxitemssecond=최대 아이템 보관량 -text.blocks.powerrange=전력 범위 -text.blocks.poweruse=전력 사용 -text.blocks.powerdamage=전력/데미지 -text.blocks.inputitemcapacity=입력 아이템 용량 -text.blocks.outputitemcapacity=출력 아이템 용량 -text.blocks.itemcapacity=저장 용량 -text.blocks.basepowergeneration=기지 전력 생성기 -text.blocks.powertransferspeed=전력 전송량 -text.blocks.craftspeed=생산 속도 -text.blocks.inputliquid=사용되는 액체 -text.blocks.inputliquidaux=보조 액체 -text.blocks.inputitem=사용되는 아이템 -text.blocks.inputitems=사용되는 아이템들 -text.blocks.outputitem=출력 아이템 -text.blocks.drilltier=드릴 -text.blocks.drillspeed=기본 드릴 속도 -text.blocks.liquidoutput=액체 출력 -text.blocks.liquidoutputspeed=액체 출력속도 -text.blocks.liquiduse=액체 사용량 -text.blocks.coolant=냉각제 -text.blocks.coolantuse=냉각수 사용 -text.blocks.inputliquidfuel=연료 액 -text.blocks.liquidfueluse=액체 연료 사용 -text.blocks.explosive=이 블록이 터지면 주변 블록과 같이 자폭을 합니다!! -text.blocks.health=체력 -text.blocks.inaccuracy=오차각 -text.blocks.shots=발포 횟수 -text.blocks.reload=재장전 -text.blocks.inputfuel=연료 -text.blocks.fuelburntime=연료 연소 시간 -text.blocks.inputcapacity=입력 용량 -text.blocks.outputcapacity=출력 용량 -text.unit.blocks=블록 -text.unit.powersecond=전력/초 -text.unit.liquidsecond=액체/초 -text.unit.itemssecond=개/초 -text.unit.pixelssecond=초당 픽셀 -text.unit.liquidunits=액체 -text.unit.powerunits=전력 -text.unit.degrees=도 -text.unit.seconds=초 -text.unit.items=아이템 -text.category.general=일반 -text.category.power=전력 -text.category.liquids=액체 -text.category.items=아이템 -text.category.crafting=제작 -text.category.shooting=사격 -setting.autotarget.name=자동 조준 -setting.fpscap.name=최대 FPS -setting.fpscap.none=없음 -setting.fpscap.text={0} FPS -setting.difficulty.training=훈련 -setting.difficulty.easy=쉬움 -setting.difficulty.normal=보통 -setting.difficulty.hard=어려움 -setting.difficulty.insane=[#00ff00]멀[#2efe2e]티[#58fa58]플[#81f781]레[#a9f5a9]이 [#81f781]전[#58fa58]용[] -setting.difficulty.name=난이도 : -setting.screenshake.name=화면 흔들기 강도 -setting.effects.name=화면 효과 -setting.sensitivity.name=컨트롤러 감도 -setting.saveinterval.name=자동저장 간격 -setting.seconds={0}초 -setting.fullscreen.name=전체 화면 -setting.multithread.name=멀티 스레드 -setting.fps.name=FPS 표시 -setting.vsync.name=VSync 활성화 -setting.lasers.name=전력 노드 레이저 표시 -setting.minimap.name=미니맵 보기 -setting.musicvol.name=음악 크기 -setting.mutemusic.name=음소거 -setting.sfxvol.name=효과음 크기 -setting.mutesound.name=소리 끄기 -setting.crashreport.name=오류 보고서 보내기 -text.keybind.title=조작키 설정 -category.general.name=일반 -category.view.name=보기 -category.multiplayer.name=멀티플레이 -command.attack=공격 -command.retreat=후퇴 -command.patrol=순찰 -keybind.press=키를 누르세요... -keybind.press.axis=축 또는 키를 누르세요... -keybind.move_x.name=오른쪽/왼쪽 이동 -keybind.move_y.name=위쪽/아래쪽 이동 -keybind.select.name=선택 -keybind.break.name=파괴 -keybind.deselect.name=선택해제 -keybind.shoot.name=사격 -keybind.zoom_hold.name=길게눌러 확대 -keybind.zoom.name=확대 -keybind.menu.name=메뉴 -keybind.pause.name=일시중지 -keybind.dash.name=달리기 -keybind.chat.name=채팅 -keybind.player_list.name=플레이어 목록 -keybind.console.name=콘솔 -keybind.rotate.name=회전 -keybind.toggle_menus.name=메뉴 보이기/숨기기 -keybind.chat_history_prev.name=이전 채팅기록 -keybind.chat_history_next.name=다음 채팅기록 -keybind.chat_scroll.name=채팅 스크롤 -keybind.drop_unit.name=유닛 드롭 -keybind.zoom_minimap.name=미니맵 확대 -mode.text.help.title=도움말 -mode.waves.name=단계 -mode.waves.description=이것은 일반 모드입니다. 제한된 자원과 자동으로 다음 단계가 시작됩니다. -mode.sandbox.name=샌드박스 -mode.sandbox.description=무한한 자원과 다음단계 시작을 위한 타이머가 없습니다. -mode.freebuild.name=자유 건축 -mode.freebuild.description=제한된 자원과 다음단계 시작을 위한 타이머가 없습니다. -mode.pvp.name=PvP -mode.pvp.description=몹이 아닌 실제 플레이어와 PvP를 합니다. -content.item.name=아이템 -content.liquid.name=액체 -content.unit.name=유닛 -content.recipe.name=블록 -content.mech.name=기체 -item.stone.name=돌 -item.stone.description=주로 용암을 사용하여 얻을 수 있는 자원입니다. -item.copper.name=구리 -item.copper.description=모든 유형의 블록에서 광범위하게 사용되는 자원입니다. -item.lead.name=납 -item.lead.description=쉽게 구할 수 있으며, 전자 및 액체 수송 블록에서 광범위하게 사용되는 자원입니다. -item.coal.name=석탄 -item.coal.description=쉽게 구할 수 있으며, 주로 제련소 등에서 연료로 사용됩니다. -item.dense-alloy.name=고밀도 합금 -item.dense-alloy.description=납과 구리로 만든 튼튼한 고밀도 합금.\n고급 수송 블록이나 상위 티어 블록을 건설하는데 사용됩니다. -item.titanium.name=티타늄 -item.titanium.description=파이프 재료나 고급 드릴, 비행기/기체 등에서 재료로 사용되는 자원입니다. -item.thorium.name=토륨 -item.thorium.description=건물의 재료, 포탑의 탄약 또는 핵연료로 사용되는 방사성 금속입니다. -item.silicon.name=실리콘 -item.silicon.description=매우 유용한 반도체로, 태양 전지판과 복잡한 전자 제품에 사용할 수 있습니다. -item.plastanium.name=플라스터늄 -item.plastanium.description=고급 항공기 및 분열 탄약에 사용되는 가벼운 연성 재료. -item.phase-fabric.name=메타 -item.phase-fabric.description=최첨단 전자 제품과 자기수리 기술에 사용되는 거의 무중력에 가까운 물질입니다. -item.surge-alloy.name=설금 -item.surge-alloy.description=주로 건물의 재료로 사용되는 자원입니다 -item.biomatter.name=바이오메터 -item.biomatter.description=이것은 유기농 덤불입니다!\n압축기에 넣어 석유로 바꿀 수 있습니다. -item.sand.name=모래 -item.sand.description=고밀도 합금이나 플럭스 등에서 제련시 광범위하게 사용되는 일반적인 재료입니다. -item.blast-compound.name=폭발물 -item.blast-compound.description=포탑 및 건설의 재료로 사용되는 휘발성 폭발물.\n연료로도 사용할 수 있지만, 별로 추천하지는 않습니다. -item.pyratite.name=피라테 -item.pyratite.description=폭발성을 가진 재료로, 주로 포탑의 탄약으로 사용됩니다. -liquid.water.name=물 -liquid.lava.name=용암 -liquid.oil.name=석유 -liquid.cryofluid.name=냉각수 -mech.alpha-mech.name=알파 -mech.alpha-mech.weapon=중무장 소총 -mech.alpha-mech.ability=드론 소환 -mech.alpha-mech.description=표준 기체.\n적절한 속도와 공격력을 갖추고 있으며, 공격 능력을 높이기 위해 최대 3대의 드론을 만들 수 있습니다. -mech.delta-mech.name=델타 -mech.delta-mech.weapon=전격 생산기 -mech.delta-mech.ability=충전 -mech.delta-mech.description=빠르게 이동하는 적을 처치하기 위한 가벼운 기체.\n구조물에는 거의 피해를 주지 않지만, 전격 무기를 사용하여 많은 적군을 매우 빠르게 죽일 수 있습니다. -mech.tau-mech.name=타우 -mech.tau-mech.weapon=건물 수리총 -mech.tau-mech.ability=유닛 치료 -mech.tau-mech.description=지원형 기체.\n총을 발사하여 건물을 치료하고 회복 능력 사용으로 화재를 진압하거나, 반경 내 아군을 치유시킵니다. -mech.omega-mech.name=오메가 -mech.omega-mech.weapon=전방 유도미사일 -mech.omega-mech.ability=방어모드 -mech.omega-mech.description=지상 기체 최종판이자 건물 파괴용으로 적합한 부피가 크고 튼튼한 기체. 방어 모드는 최대 90% 의 피해를 줄일 수 있습니다. -mech.dart-ship.name=다트 -mech.dart-ship.weapon=소총 -mech.dart-ship.description=표준 비행선. 빠르고 가볍지만 공격력이 거의 없고 채광 속도가 느립니다. -mech.javelin-ship.name=자비린 -mech.javelin-ship.description=치고 빠지는 공격을 위한 비행선. 처음에는 느리지만, 가속도가 붙어 엄청난 속도로 미사일 피해를 입힐 수 있으며, 전격 능력을 사용할 수 있습니다. -mech.javelin-ship.weapon=유도 미사일 -mech.javelin-ship.ability=가속 전격 생성기 -mech.trident-ship.name=삼지창 -mech.trident-ship.description=대형 공중 폭격기. 당연하게도 엄청 단단합니다. -mech.trident-ship.weapon=폭탄 저장고 -mech.glaive-ship.name=글레브 -mech.glaive-ship.description=크고 잘 무장된 총을 가진 비행선. 방화용 리피터가 장착되어 있으며, 가속도와 최대속도가 높습니다. -mech.glaive-ship.weapon=방화총 -text.item.explosiveness=[LIGHT_GRAY]폭발력 : {0} -text.item.flammability=[LIGHT_GRAY]인화성 : {0} -text.item.radioactivity=[LIGHT_GRAY]방사능 : {0} -text.item.fluxiness=[LIGHT_GRAY]플럭스 파워 : {0} -text.unit.health=[LIGHT_GRAY]체력 : {0} -text.unit.speed=[LIGHT_GRAY]속도 : {0} -text.mech.weapon=[LIGHT_GRAY]무기 : {0} -text.mech.armor=[LIGHT_GRAY]방어력 : {0} -text.mech.itemcapacity=[LIGHT_GRAY]아이템 수용 용량 : {0} -text.mech.minespeed=[LIGHT_GRAY]채광 속도 : {0} -text.mech.minepower=[LIGHT_GRAY]채광 레벨 : {0} -text.mech.ability=[LIGHT_GRAY]능력 : {0} -text.liquid.heatcapacity=[LIGHT_GRAY]발열량 : {0} -text.liquid.viscosity=[LIGHT_GRAY]점도 : {0} -text.liquid.temperature=[LIGHT_GRAY]온도 : {0} -block.constructing={0}[LIGHT_GRAY](만드는중) -block.spawn.name=적 스폰지점 -block.core.name=코어 -block.metalfloor.name=철판 -block.deepwater.name=깊은물 -block.water.name=물 -block.lava.name=용암 -block.tar.name=타르 -block.blackstone.name=검은돌 -block.stone.name=돌 -block.dirt.name=흙 -block.sand.name=모래 -block.ice.name=얼음 -block.snow.name=눈 -block.grass.name=잔디 -block.shrub.name=관목 -block.rock.name=바위 -block.blackrock.name=검은바위 -block.icerock.name=얼음바위 -block.copper-wall.name=구리벽 -block.copper-wall-large.name=큰 구리벽 -block.dense-alloy-wall.name=합금 벽 -block.dense-alloy-wall-large.name=큰 합금 벽 -block.phase-wall.name=메타벽 -block.phase-wall-large.name=큰 메타벽 -block.thorium-wall.name=토륨벽 -block.thorium-wall-large.name=대형 토륨벽 -block.door.name=문 -block.door-large.name=대형문 -block.duo.name=듀오 -block.scorch.name=스코치 -block.hail.name=헤일 -block.lancer.name=랜서 -block.conveyor.name=컨베이어 -block.titanium-conveyor.name=티타늄 컨베이어 -block.junction.name=교차기 -block.router.name=분배기 -block.distributor.name=대형 분배기 -block.sorter.name=필터 -block.sorter.description=아이템을 넣어서 필터에 설정된 아이템일 경우 바로 앞으로 통과하며, 그렇지 않을 경우 옆으로 통과합니다. -block.overflow-gate.name=오버플로 게이트 -block.overflow-gate.description=정면으로 가는 자원이 막히면 옆으로 출력하고, 그렇지 않으면 계속 정면으로 출력합니다. -block.smelter.name=제련소 -block.arc-smelter.name=대형 제련소 -block.silicon-smelter.name=실리콘 제련소 -block.phase-weaver.name=메타 합성기 -block.pulverizer.name=분쇄기 -block.cryofluidmixer.name=냉각수 제조기 -block.melter.name=융해기 -block.incinerator.name=소각로 -block.biomattercompressor.name=바이오메터 압축기 -block.separator.name=셉터 -block.centrifuge.name=원심 분리기 -block.power-node.name=전력 송신기 -block.power-node-large.name=대형 전력 송신기 -block.battery.name=배터리 -block.battery-large.name=대형 배터리 -block.combustion-generator.name=석탄 발전기 -block.turbine-generator.name=터빈 발전기 -block.mechanical-drill.name=기계식 드릴 -block.pneumatic-drill.name=강철 드릴 -block.laser-drill.name=레이저 드릴 -block.water-extractor.name=물 추출기 -block.cultivator.name=온실 -block.alpha-mech-pad.name=알파 기체 패드 -block.dart-ship-pad.name=다트 비행선 패드 -block.delta-mech-pad.name=델타 기체 패드 -block.javelin-ship-pad.name=자비린 비행선 패드 -block.trident-ship-pad.name=삼지창 비행선 패드 -block.glaive-ship-pad.name=글레브 비행선 패드 -block.omega-mech-pad.name=오메가 기체 패드 -block.tau-mech-pad.name=타우 기체 패드 -block.conduit.name=파이프 -block.mechanical-pump.name=기계식 펌프 -block.itemsource.name=아이템 소스 -block.itemvoid.name=아이템 삭제 장치 -block.liquidsource.name=무한 액체공급 장치 -block.powervoid.name=방전장치 -block.powerinfinite.name=무한 전력공급 장치 -block.unloader.name=언로더 -block.vault.name=창고 -block.wave.name=파도 -block.swarmer.name=스웜 -block.salvo.name=살보 -block.ripple.name=립플 -block.phase-conveyor.name=메타 컨베이어 -block.bridge-conveyor.name=터널 -block.plastanium-compressor.name=플라스터늄 압축기 -block.pyratite-mixer.name=피라테 제조기 -block.blast-mixer.name=폭발물 제조기 -block.solidifer.name=고체 -block.solar-panel.name=태양 전지판 -block.solar-panel-large.name=대형 태양 전지판 -block.oil-extractor.name=석유 추출기 -block.spirit-factory.name=스피릿 드론 공장 -block.phantom-factory.name=팬텀 드론 공장 -block.wraith-factory.name=유령 전투기 공장 -block.ghoul-factory.name=구울 폭격기 공장 -block.dagger-factory.name=디거 기체 공장 -block.titan-factory.name=타이탄 기체 공장 -block.fortress-factory.name=포트리스 기체 공장 -block.revenant-factory.name=레비던트 전투기 공장 -block.repair-point.name=정비소 -block.pulse-conduit.name=퓨즈 파이프 -block.phase-conduit.name=메타 파이프 -block.liquid-router.name=액체 분배기 -block.liquid-tank.name=물탱크 -block.liquid-junction.name=액체 교차기 -block.bridge-conduit.name=다리 파이프 -block.rotary-pump.name=동력 펌프 -block.thorium-reactor.name=토륨 원자로 -block.command-center.name=명령 본부 -block.mass-driver.name=물질 이동기 -block.blast-drill.name=고속 발열 드릴 -block.thermal-pump.name=화력 펌프 -block.thermal-generator.name=열발전기 -block.alloy-smelter.name=설금 제련소 -block.mend-projector.name=수리 프로젝터 -block.surge-wall.name=설금벽 -block.surge-wall-large.name=큰 설금벽 -block.cyclone.name=사이클론 -block.fuse.name=퓨즈 -block.shock-mine.name=전격 지뢰 -block.overdrive-projector.name=오버드라이브 프로젝터 -block.force-projector.name=보호막 프로젝터 -block.arc.name=Arc -block.rtg-generator.name=토륨 발전소 -block.spectre.name=스펙터 -block.meltdown.name=멜트다운 -block.container.name=컨테이너 -team.blue.name=블루팀 -team.red.name=레드팀 -team.orange.name=오렌지팀 -team.none.name=공기팀 -team.green.name=그린팀 -team.purple.name=보라색팀 -unit.alpha-drone.name=알파 드론 -unit.spirit.name=스피릿 드론 -unit.spirit.description=기본 드론 유닛. 기본적으로 코어에서 1개가 스폰됩니다. 자동으로 채광하며 아이템을 수집하고, 블록을 수리합니다. -unit.phantom.name=팬텀 드론 -unit.phantom.description=첨단 드론 유닛. 광석을 자동으로 채광하며, 아이템을 수집하고 블록을 수리합니다. 일반 드론보다 훨씬 효과적입니다. -unit.dagger.name=디거 -unit.dagger.description=기본 지상 유닛입니다. 스웜과 같이 쓰면 유용합니다. -unit.titan.name=타이탄 -unit.titan.description=고급 지상 유닛입니다. 고밀도 합금을 탄약으로 사용하며 지상과 공중 둘다 공격할 수 있습니다. -unit.ghoul.name=구울 폭격기 -unit.ghoul.description=무거운 지상 폭격기 입니다. 폭발물 또는 피라테를 탄약으로 사용합니다. -unit.wraith.name=유령 전투기 -unit.wraith.description=코어를 집중적으로 공격하는 방식을 사용하는 전투기 입니다. -unit.fortress.name=포트리스 -unit.fortress.description=중포 지상 유닛. 높은 공격력과 체력을 가지고 있습니다. -unit.revenant.name=레비던트 -unit.revenant.description=대형 레이저를 발사하는 공중 유닛입니다. -tutorial.begin=플레이어의 주요 목표는 [LIGHT_GRAY]적군[]을 제거하는 것입니다.\n\n이 게임은 [accent]구리를 채광[]하는 것으로 시작합니다.\n이것을 하기 위해 플레이어의 중심부 근처에 있는 구리 광맥을 누르세요. -tutorial.drill=수동으로 채광하는 것은 효율이 낮습니다.\n[accent]드릴[]은 자동으로 채광 작업을 합니다.\n구리 광맥에 표시된 영역에 드릴을 하나를 놓으세요. -tutorial.conveyor=[accent]컨베이어[]를 사용하여 아이템을 코어로 운반합니다.\n드릴에서 코어까지 컨베이어 라인을 만드세요. -tutorial.morecopper=더 많은 구리가 필요합니다.\n\n수동으로 채광하거나, 드릴을 더 설치하세요. -tutorial.turret=방어 구조물은 [LIGHT_GRAY]적[]을 물리치기 위해 반드시 필요합니다.\n기지 근처에 듀오 터렛을 설치하세요. -tutorial.drillturret=듀오 터렛이 작동하기 위해서는[accent] 구리 탄약 []을 필요로 합니다.\n터렛 옆에 드릴을 설치하여 구리를 공급하세요. -tutorial.waves=[LIGHT_GRAY]적[]이 접근합니다.\n\n2단계 동안 코어를 보호하고 더 많은 터렛을 만드세요. -tutorial.lead=더 많은 광석을 이용할 수 있습니다. [accent]납[]을 찾아 탐색하세요.\n\n아이템을 코어로 전송할려면 플레이어 기체 또는 비행기에서 코어로 드래그 하세요. -tutorial.smelter=구리와 납은 약한 금속입니다.\n[accent]고밀도 합금[]은 제련소에서 만들 수 있습니다.\n\n하나 만드세요. -tutorial.densealloy=이 제련소는 이제 고밀도 합금을 생산할 것입니다.\n몇개 더 생산하세요.\n필요한 경우 더 만드세요. -tutorial.siliconsmelter=이제 이코어는 채굴과 수리하기 위한[accent] 스피릿 드론[]을 생성 할 것 입니다.\n\n[accent]실리콘[]을 사용해 다른 유닛을 생성하기 위한 공장을 만들 수 있습니다.\n실리콘 제련기를 제작하세요! -tutorial.silicondrill=실리콘을 제작하려면[accent] 석탄[] 과[accent] 모래[]가 필요합니다.\n드릴을 먼저 건설해보는건 어떤가요? -tutorial.generator=이 건물은 [LIGHT_YELLOW]전력[]이 필요합니다.\n[accent] 석탄 발전기[]를 건설하세요. -tutorial.generatordrill=[accent] 석탄 발전기[]는 연료가 필요합니다.\n[accent] 석탄[]을 드릴로 채굴해서 연료를 체워주세요. -tutorial.node=전력은 송신해줄 송신기가 필요합니다.\n[accent] 전력 송신기[]를 석탄 등등 발전기 옆에 설치해서 생산된 전기를 다른곳으로 송신합시다. -tutorial.nodelink=전력은 전력 블록과 발전기에 연결하거나, 연결된 전력 송신기를 통해 전송이 가능합니다. \n\n전력 송신기를 누르고 발전기와 실리콘 제련기를 선택하여 전원을 연결합시다. -tutorial.silicon=실리콘이 생산되고 있습니다.\n\n생산 시스템의 개선을 권고 드립니다. -tutorial.daggerfactory=이[accent] 디거 기체 공장[]은\n\n공격하는 기체를 생산하기 위해 사용됩니다. -tutorial.router=공장을 작동시키기 위해 자원이 필요합니다.\n컨베이어에 운반되고 있는 자원을 분할할 분배기를 만드세요. -tutorial.dagger=전력 노드를 공장에 연결하세요.\n일단 요구 사항이 충족되면 기체 생산을 시작합니다.\n\n필요에 따라 드릴 및 발전기, 컨베이어를 더 많이 만들 수 있습니다. -tutorial.battle=[LIGHT_GRAY]적[]의 코어가 드러났습니다.\n당신의 부대와 디거를 사용하여 파괴하세요. -block.core.description=게임에서 가장 중요한 건물.\n파괴되면 게임이 끝납니다. -block.copper-wall.description=구리로 만든 벽. -block.copper-wall-large.description=구리로 만든 큰 벽. -block.dense-alloy-wall.description=고밀도 합금으로 만든 벽. 구리벽보다 체력이 높습니다. -block.dense-alloy-wall-large.description=고밀도 합금으로 만든 큰 벽. -block.thorium-wall.description=토륨으로 만든 벽. -block.thorium-wall-large.description=토륨으로 만든 큰 벽. -block.phase-wall.description=날라오는 모든 총알을 튕겨내고 데미지를 입는 특수한 벽입니다. -block.phase-wall-large.description=메타로 제작한 큰 벽. 날라오는 총알을 모두 튕겨냅니다. -block.surge-wall.description=데미지를 입으면 번개를 일으켜 대상에게 피해를 입히는 특수한 벽입니다. -block.surge-wall-large.description=설금을 재료로 한 큰 벽.\n데미지를 입으면 번개를 일으켜 대상에게 피해를 입힙니다. -block.door.description=유닛이 지나갈 수 있도록 만든 문. 클릭하면 열고 닫습니다. -block.door-large.description=유닛이 자나갈 수 있도록 만든 큰 문. 클릭하면 열고 닫습니다. -block.mend-projector.description=주위 건물을 치료하는 건물입니다. -block.overdrive-projector.description=범위 내 모든 행동의 속도를 높여주는 보조형 건물입니다. -block.force-projector.description=보호막을 생성하는 건물.\n기본적으로 전력만 있으면 작동하지만, 메타를 넣어 보호막의 범위를 크게 확장시킬 수 있습니다. -block.shock-mine.description=적이 이 블록을 지나가면 전격 공격을 하는 함정형 방어 건물입니다. -block.duo.description=범용성을 가진 터렛.\n지상 및 공중공격을 하며, 초중반에 유용합니다. -block.arc.description=목표 방향으로 전격 공격을 하는 포탑입니다. -block.hail.description=장거리 지상 공격을 하는 터렛입니다.\n적이 오기 전에 쓸어버릴 수 있습니다. -block.lancer.description=중거리 레이져 포탑입니다.\n적을 관통하기 때문에 뭉쳐있는 적들에게 매우 효과적입니다. -block.wave.description=적이 있는 자리에 액체를 뿌립니다.\n이 포탑을 활용하여 액체를 뿌린 곳에 불을 붙이거나 적을 느리게 할 수 있습니다. -block.salvo.description=명중률이 높고, 3발씩 끊어 발사하는 포탑입니다. -block.swarmer.description=4발씩 끊어서 유도체를 발사하는 포탑입니다 -block.ripple.description=4개의 탄약으로 나눠 발사하여 명중률이 낮지만, 사거리가 매우 긴 포탑입니다. -block.cyclone.description=낮은 명중률과 높은 RPM 을 가진 포탑입니다.\n탄약이 남아있는 한 멈추지 않고 계속 연사합니다. -block.fuse.description=단거리에서 범위형 레이저를 발사하는 포탑입니다. -block.spectre.description=높은 명중률과 RPM 을 가진 포탑입니다.\n탄약이 남아있는 한 멈추지 않고 계속 연사합니다. -block.meltdown.description=목표를 따라 초대형 레이져를 발사하는 포탑입니다.\n뭉쳐있는 몹에게 매우 효과가 좋습니다. -block.conveyor.description=느린 속도로 자원을 수송할 수 있는 컨베이어. -block.titanium-conveyor.description=빠른 속도로 자원을 수송할 수 있는 컨베이어. -block.phase-conveyor.description=자원을 순간이동 시켜 주는 컨베이어 입니다. -block.junction.description=컨베이어를 교차시켜 자원을 수송할 때 사용할 수 있는 블록입니다. -block.mass-driver.description=자원을 받아서 다른 물질 이동기로 전달할 수 있는 블록입니다.\n엄청난 사거리를 가지고 있으며, 주로 컨베이어가 접근할 수 없는 곳에 유용하게 사용됩니다. -block.smelter.description=고밀도 합금을 제작할 수 있는 건물입니다. -block.arc-smelter.description=고밀도 합금을 제작할 수 있는 건물이지만, 이 건물은 석탄이 필요 없고 좀더 빠른 속도로 합금을 생산해낼 수 있습니다. -block.silicon-smelter.description=실리콘을 제작할 수 있는 건물입니다. -block.plastanium-compressor.description=플라스터늄을 제조할 수 있는 건물입니다. -block.phase-weaver.description=메타를 제작할 수 있는 건물입니다. -block.alloy-smelter.description=설금을 제작할 수 있는 건물입니다. -block.pulverizer.description=돌을 갈아서 모래로 만들 수 있는 건물입니다. -block.pyratite-mixer.description=피라테를 제조할 수 있는 건물입니다. -block.blast-mixer.description=폭발물을 제조할 수 있는 건물입니다. -block.cryofluidmixer.description=냉각수를 제작할 수 있는 건물입니다. -block.solidifer.description=용암을 돌로 만들 수 있는 건물입니다. -block.melter.description=돌로 용암을 만들 수 있는 건물입니다. -block.incinerator.description=불필요한 아이템을 소각시켜 줄 수 있는 건물입니다. -block.biomattercompressor.description=잔디밭에서 바이오메터를 추출할 수 있는 건물입니다. -block.separator.description=돌을 분해하여 각종 자원으로 재활용 할 수 있게 해 주는 건물입니다. -block.centrifuge.description=돌을 분해하여 각종 자원으로 재활용 할 수 있게 해 주는 건물이지만, 이 건물은 좀 더 다양한 자원을 얻을 수 있게 해 줍니다. -block.power-node.description=생성된 전력를 다른 건물로 전달하기 위한 전력 노드입니다. -block.power-node-large.description=생성된 전력를 다른 건물로 전달하기 위한 건물이며, 일반 노드보다 더 많은 전력을 이동시킬 수 있습니다. -block.battery.description=흔히 아는 충전식 배터리입니다.\n전력을 사용하는 건물에 전력이 떨어질경우, 이 배터리를 전력 노드에 연결하면 이 배터리에 저장된 전력을 소모하여 지속적으로 공급할 수 있습니다. -block.battery-large.description=일반 배터리보다 용량이 매우 커진 커진 배터리. -block.combustion-generator.description=석탄을 연료로 전력를 생산해내는 발전소 입니다. -block.turbine-generator.description=석탄 발전기보다 더 많은량의 전력를 생산하는 발전기입니다. -block.thermal-generator.description=용암을 원료로 전력을 생산할 수 있는 발전소입니다. -block.solar-panel.description=태양열을 받아 자기 스스로 전력을 생산하는 건물입니다. -block.solar-panel-large.description=태양열을 받아 자기 스스로 전력을 생산하지만, 이 블록은 더 빨리 전력을 생산할 수 있습니다. -block.thorium-reactor.description=토륨을 원료로 하는 토륨 원자로 입니다.\n많은 전력을 생산하지만 엄청난 열을 발생시키기 때문에, 많은 량의 물 또는 냉각수가 있어야 터지지 않고 작동합니다. -block.rtg-generator.description=냉각은 필요 없지만 토륨 원자로보다 적은량의 전력을 생산하는 방사선 동위원소 열전자 발전기. -block.unloader.description=해당 창고 및 코어에서 자원을 빼내는데 사용됩니다. -block.container.description=아이템을 임시로 저장할 수 있는 소형 창고입니다. -block.vault.description=아이템을 임시로 저장할 수 있는 대형 창고입니다. -block.mechanical-drill.description=구리로 제작할 수 있는 기본 드릴입니다. -block.pneumatic-drill.description=돌, 티타늄을 채광할 수 있는 고급 드릴입니다. -block.laser-drill.description=토륨을 채광할 수 있는 최고급 드릴입니다.\n전력과 물을 공급하여 빠른 속도로 채광할 수 있습니다. -block.blast-drill.description=최상위 드릴입니다. 엄청난 양의 전력과 물을 소모하는 대신, 매우 빠른 속도로 채광합니다. -block.water-extractor.description=바닥에서 물을 추출하여 건물에 공급할 수 있는 건물입니다. -block.cultivator.description=잔디에서 바이오메터를 추출할 수 있는 건물입니다. -block.oil-extractor.description=석유를 추출 해 주는 건물입니다. -block.dart-ship-pad.description=다트 비행선으로 바꿀 수 있는 패드입니다. -block.trident-ship-pad.description=삼지창 비행선으로 바꿀 수 있는 패드입니다. -block.javelin-ship-pad.description=자비린 비행선으로 바꿀 수 있는 패드입니다. -block.glaive-ship-pad.description=글레브 비행선으로 바꿀 수 있는 패드입니다. -block.tau-mech-pad.description=타우 기체로 바꿀 수 있는 패드 -block.delta-mech-pad.description=델타 기체로 바꿀 수 있는 패드입니다. -block.omega-mech-pad.description=오메가 기체로 바꿀 수 있는 패드 -block.spirit-factory.description=스피릿 유닛을 생산하는 공장입니다. -block.phantom-factory.description=유닛 팬텀을 생산하는 공장입니다. -block.wraith-factory.description=유닛 유령 전투기를 소환하는 공장입니다. -block.ghoul-factory.description=구울 유닛을 생산하는 공장입니다. -block.dagger-factory.description=디거를 생산하는 공장입니다. -block.titan-factory.description=타이탄 유닛을 생산할 수 있는 공장입니다. -block.fortress-factory.description=포트리스를 생산하는 공장입니다. -block.revenant-factory.description=레비던트 유닛을 생산할 수 있는 공장입니다. -block.repair-point.description=근처 유닛들을 수리하는 건물입니다. -block.command-center.description=생산된 유닛들을 제어할 수 있는 건물.\n첫번째 버튼은 적 기지로 공격하며, 두번째는 대기 상태, 세번째는 기지 근처를 돌며 정찰합니다. -block.conduit.description=일반 파이프. 액체가 지나갈 수 있도록 해 줍니다. -block.pulse-conduit.description=티타늄으로 만들어 졌으며, 일반 파이프보다 액체 수용량이 높습니다. -block.phase-conduit.description=물을 먼거리로 순간이동 시켜 주는 장치입니다. -block.liquid-router.description=물펌프를 다른 방향으로 분배할 수 있게 하는 블럭입니다. -block.liquid-tank.description=액체 종류를 저장할 수 있는 물탱크 입니다. -block.liquid-junction.description=물펌프와 다른 물펌프를 서로 교차시키게 할 수 있는 블럭입니다. -block.bridge-conduit.description=다리와 다리 사이를 연결하여 액체가 지나갈 수 있게 해 줍니다.\n주로 다리 사이에 지나갈 수 없는 장애물이 있을 때 사용합니다. -block.mechanical-pump.description=구리로 제작할 수 있는 기계식 물펌프입니다. -block.rotary-pump.description=일반 물 펌프보다 더 빠른 속도로 물을 끌어올릴 수 있는 펌프입니다. -block.thermal-pump.description=기계식 펌프보다 3배 빠른 속도로 액체를 퍼올릴 수 있는 펌프이며, 용암도 퍼올릴 수 있는 유일한 펌프입니다. -block.router.description=한 방향에서 아이템을 받은 후 최대 3개의 다른 방향으로 동일하게 출력합니다.\n재료를 한곳에서 여러 대상으로 분할하여 운반하는데 유용합니다. -block.distributor.description=아이템을 최대 7개의 다른 방향으로 똑같이 분할하는 고급 분배기. -block.bridge-conveyor.description=고급 자원 수송 블록.\n지형이나 건물을 넘어 최대 3개 타일을 건너뛰고 자원을 운송할 수 있습니다. -block.alpha-mech-pad.description=알파 기체로 바꿀 수 있는 패드입니다. -block.itemsource.description=자원을 선택하면 그 자원이 무한하게 생성되는 블록입니다. -block.liquidsource.description=무한한 액체를 출력해냅니다. -block.itemvoid.description=아이템을 사라지게 만듭니다. -block.powerinfinite.description=무한한 전력을 공급해주는 블록입니다. -block.powervoid.description=설정된 아이템을 계속해서 출력하는 블록입니다. -liquid.water.description=지상 유닛이 이 위를 지나가면 이동속도가 느려지고, 깊은 물에 빠지면 죽습니다. -liquid.lava.description=지상 유닛이 이 위를 지나가면 이동속도가 매우 느려지고, 지속적으로 데미지를 입습니다. -liquid.oil.description=일부 조합 블록에서 사용되는 자원입니다. -liquid.cryofluid.description=포탑 및 토륨 원자로에서 사용되는 자원입니다. +text.credits.text = Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GRAY](In case you can't tell, this text is currently unfinished.\nTranslators, don't edit it yet!) +text.credits = 제작자 +text.discord = Mindustry Discord 에 참여하세요! +text.link.discord.description = 공식 Mindustry Discord 채팅방 +text.link.github.description = 게임 소스코드 +text.link.dev-builds.description = 개발중인 빌드 +text.link.trello.description = 다음 출시될 기능들을 게시한 공식 Trello 보드 +text.link.itch.io.description = PC 버전 다운로드와 HTML5 버전이 있는 itch.io 사이트 +text.link.google-play.description = Google Play 스토어 정보 +text.link.wiki.description = 공식 Mindustry 위키 (영어) +text.linkfail = 링크를 여는데 실패했습니다! URL이 기기의 클립보드에 복사되었습니다. +text.gameover = 코어가 터졌습니다. 게임 오버! +text.gameover.pvp = [accent]{0}[] 팀이 승리했습니다! +text.sector.gameover = 이 지역을 공략하는데 실패했습니다. 포기 하시겠습니까? +text.sector.retry = 아니오 +text.highscore = [YELLOW]최고점수 달성! +text.wave.lasted = [accent]{0}[] 까지 버티셨습니다. +text.level.highscore = 최고 점수 : [accent]{0} +text.level.delete.title = 삭제 확인 +text.map.delete = 정말로 "[accent]{0}[]" 맵을 삭제하시겠습니까? +text.level.select = 맵 선택 +text.level.mode = 게임모드 : +text.construction.desktop = PC 에서의 조작 방법이 변경되었습니다.\n블록 선택을 해제하거나 건설을 중지하려면 [accent]스페이스 바[]를 누르세요. +text.construction.title = 블록 배치 안내서 +text.construction = [accent]블록 배치 모드[]를 선택하셨습니다.\n\n블록을 설치하고 싶으면, 자신의 건설 가능 범위 내에서 간단히 탭 하면 됩니다.\n일부 블록을 선택한 후에 확인 버튼을 누르면 배가 배치 작업을 진행할 것입니다.\n\n- [accent]블록을 삭제[]하고 싶다면 배치하고 싶은 영역을 탭 하세요. \n- [accent]블록을 넓게 배치[]하고 싶다면 배치하고 싶은 시작 영역을 길게 누르며 드래그 하면 됩니다.\n- [accent]블록을 한줄로 배치[]하고 싶다면 배치하고 싶은 시작 영역을 한번 탭 하고 길게 누르면서 드래그 하면 됩니다. \n- [accent]블록 배치 모드를 취소[]하고 싶다면 화면 하단 왼쪽에 있는 X 버튼을 누르면 됩니다. +text.deconstruction.title = 블록 삭제 안내서 +text.deconstruction = [accent]블록 삭제 모드[]를 선택하셨습니다\n\n블록을 삭제하고 싶다면, 자신의 건설 가능 범위 내에서 간단히 탭 하면 됩니다.\n일부 블록을 선택한 후에 확인 버튼을 누르면 배가 파괴 작업을 진행할 것입니다.\n\n- [accent]블록을 삭제[]하고 싶다면 배치하고 싶은 영역을 탭 하세요\n- [accent]블록을 넓은 범위로 삭제[]하고 싶다면 배치하고 싶은 시작 영역을 길게 누르며 드래그 하면 됩니다.\n- [accent]블록 삭제 모드를 취소[]하고 싶다면 화면 하단 왼쪽에 있는 X 버튼을 누르면 됩니다. +text.showagain = 다음 세션에서 이 메세지를 표시하지 않습니다 +text.coreattack = < 코어가 공격받고 있습니다! > +text.unlocks = 아이템들 +text.savegame = 게임 저장 +text.loadgame = 게임 불러오기 +text.joingame = 멀티플레이 +text.addplayers = 플레이어 추가/제거 +text.customgame = 커스텀 게임 +text.sectors = 지역 플레이 +text.sector = 지역 : [LIGHT_GRAY]{0} +text.sector.time = 시간 : [LIGHT_GRAY]{0} +text.sector.deploy = 시작 +text.sector.abandon = 초기화 +text.sector.abandon.confirm = 정말로 이 지역의 모든 진행상황을 초기화 하겠습니까?\n이 작업은 되돌릴 수 없습니다! +text.sector.resume = 계속하기 +text.sector.locked = [scarlet][[완료안됨] +text.sector.unexplored = [accent][[탐색안됨] +text.missions = 목표 : [LIGHT_GRAY] {0} +text.mission = 목표 : [LIGHT_GRAY] {0} +text.mission.main = 주요 목표 : [LIGHT_GRAY]{0} +text.mission.info = 미션 정보 +text.mission.complete = 미션 성공! +text.mission.complete.body = 지역 {0},{1} 클리어. +text.mission.wave = [accent]{0}/{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}개 수집 +text.mission.resource = {0} 을(를) 수집하세요\n[accent]{1}/{2} +text.mission.block = {0} 를 만드세요 +text.mission.unit = {0} 유닛을 만드세요 +text.mission.command = 유닛에게 {0} 명령을 보내세요 +text.mission.linknode = 전력 노드를 연결하세요 +text.mission.display = [accent]목표 : [LIGHT_GRAY]{0} +text.mission.mech = [accent]{0}[] 기체로 바꾸세요 +text.mission.create = [accent]{0}[] 을(를)설치하세요. +text.none = <없음> +text.close = 닫기 +text.quit = 나가기 +text.maps = 맵 +text.continue = 계속하기 +text.nextmission = 다음 임무 +text.maps.none = [LIGHT_GRAY]맵을 찾을 수 없습니다! +text.about.button = 정보 +text.name = 이름 : +text.filename = 파일 이름 : +text.unlocked = 새 블록 잠금 해제됨 +text.unlocked.plural = 잠금 해제 +text.players = 현재 {0}명 접속중 +text.players.single = 현재 {0}명만 있음. +text.server.closing = [accent]서버 닫는중... +text.server.kicked.kick = 서버에서 추방되었습니다! +text.server.kicked.serverClose = 서버 종료됨. +text.server.kicked.sectorComplete = 지역 클리어. +text.server.kicked.sectorComplete.text = 임무 성공.\n서버가 다음지역 맵으로 이동되었습니다. +text.server.kicked.clientOutdated = 오래된 버전의 클라이언트 입니다! 게임을 업데이트 하세요! +text.server.kicked.serverOutdated = 오래된 버전의 서버입니다! 서버 호스트 관리자에게 문의하세요! +text.server.kicked.banned = 뭘 하셨는지는 모르겠지만, 이제 영원히 서버에 접속할 수 없습니다. +text.server.kicked.recentKick = 방금 추방처리 되었습니다. 잠시 기다린 후에 접속 해 주세요. +text.server.kicked.nameInUse = 이 닉네임이 이미 서버에서 사용중입니다. +text.server.kicked.nameEmpty = 닉네임에는 반드시 영어 또는 숫자가 있어야 합니다. +text.server.kicked.idInUse = 이미 서버에 접속중입니다! 다중 계정은 허용되지 않습니다. +text.server.kicked.customClient = 이 서버는 직접 빌드한 버전을 지원하지 않습니다. 공식 버전을 사용하세요. +text.host.info = [accent]호스트[] 버튼은 현재 네트워크의 [scarlet]6567[] 포트를 사용합니다.\n[LIGHY_GRAY]같은 Wi-Fi 또는 로컬 네트워크[] 에서 서버 목록을 볼 수 있습니다.\n\n만약 플레이어들이 이 IP를 통해 어디에서나 연결할 수 있게 하고 싶다면, 공유기 설정에서 [accent]포트 포워딩[]을 해야 합니다.\n\n[LIGHT_GRAY]참고 : LAN 게임 연결에 문제가 있는 사람이 있다면, 방화벽 설정에서 Mindustry 가 로컬 네트워크에 액세스하도록 허용했는지 확인 해 주세요. +text.join.info = 여기서 [accent]서버 IP[]를 입력하여 다른 서버에 접속할 수 있습니다.\n또는 [accent]로컬 네트워크(LAN)[] 서버를 검색하여 접속할 수 있습니다.\nLAN 및 WAN 멀티 플레이어 모두 지원됩니다.\n\n[LIGHT_GRAY]참고:여기에서는 자동으로 글로벌 서버를 추가하지 않습니다. IP로 다른 사람의 서버에 접속할려면 서버장에게 IP를 요청해야 합니다. +text.hostserver = 서버 열기 +text.hostserver.mobile = 서버\n열기 +text.host = 서버 열기 +text.hosting = [accent]서버 여는중... +text.hosts.refresh = 새로고침 +text.hosts.discovering = LAN 게임 찾기 +text.server.refreshing = 서버 목록 새로고치는중... +text.hosts.none = [lightgray]LAN 게임을 찾을 수 없습니다! +text.host.invalid = [scarlet]서버에 연결할 수 없습니다! +text.trace = 플레이어 정보 보기 +text.trace.playername = 이름 : [accent]{0} +text.trace.ip = IP : [accent]{0} +text.trace.id = 고유 ID : [accent]{0} +text.trace.android = Android 클라이언트 : [accent]{0} +text.trace.modclient = 수정된 클라이언트 : [accent]{0} +text.trace.totalblocksbroken = 총 블록 파괴 개수 : [accent]{0} +text.trace.structureblocksbroken = 구조 블록 파괴 수 : [accent]{0} +text.trace.lastblockbroken = 마지막으로 파괴한 블록 : [accent]{0} +text.trace.totalblocksplaced = 총 설치한 블록 개수 : [accent]{0} +text.trace.lastblockplaced = 마지막으로 설치한 블록 : [accent]{0} +text.invalidid = 잘못된 클라이언트 ID 입니다! 공식 Mindustry Discord 으로 버그 보고서를 제출 해 주세요. +text.server.bans = 차단된 유저 +text.server.bans.none = 차단된 플레이어가 없습니다. +text.server.admins = 관리자 +text.server.admins.none = 관리자가 없습니다! +text.server.add = 서버 추가 +text.server.delete = 이 서버를 삭제 하시겠습니까? +text.server.hostname = 호스트 : {0} +text.server.edit = 서버 수정 +text.server.outdated = [crimson]서버 버전이 낮습니다![] +text.server.outdated.client = [Crimson]클라이언트 버전이 낮습니다![] +text.server.version = [lightgray]서버 버전 : {0} +text.server.custombuild = [yellow]커스텀 서버 +text.confirmban = 이 플레이어를 차단하시겠습니까? +text.confirmkick = 정말로 이 플레이어를 추방시키겠습니까? +text.confirmunban = 이 플레이어를 차단해제 하시겠습니까? +text.confirmadmin = 이 플레이어를 관리자로 만들겠습니까? +text.confirmunadmin = 이 플레이어를 일반 유저로 만들겠습니까? +text.joingame.title = 게임 참가 +text.joingame.ip = IP : +text.disconnect = 서버와 연결이 해제되었습니다. +text.disconnect.data = 맵 데이터를 받아오는데 실패했습니다. +text.connecting = [accent]연결중... +text.connecting.data = [accent]맵 데이터 다운로드중... +text.server.port = 포트 : +text.server.addressinuse = 이 주소는 이미 사용중입니다! +text.server.invalidport = 포트 번호가 잘못되었습니다. +text.server.error = [crimson]{0}[accent]서버를 여는데 오류가 발생했습니다.[] +text.save.old = 이 저장파일은 이전 버전의 게임용이며, 지금은 사용할 수 없습니다. \n\n[LIGHT_GRAY]4.0 정식때 이전 게임버전에서 만든 저장파일과 호환됩니다. +text.save.new = 새로 저장 +text.save.overwrite = 이 저장 슬롯을 덮어씌우겠습니까? +text.overwrite = 덮어쓰기 +text.save.none = 저장 파일을 찾지 못했습니다! +text.saveload = [accent]저장중... +text.savefail = 게임을 저장하지 못했습니다! +text.save.delete.confirm = 이 저장파일을 삭제 하시겠습니까? +text.save.delete = 삭제 +text.save.export = 저장파일 내보내기 +text.save.import.invalid = [accent]파일이 잘못되었습니다! +text.save.import.fail = [crimson]저장파일을 불러오지 못함 : [accent]{0} +text.save.export.fail = [crimson]저장파일을 내보내지 못함 : [accent]{0} +text.save.import = 저장파일 불러오기 +text.save.newslot = 저장 파일이름 : +text.save.rename = 이름 변경 +text.save.rename.text = 새 이름 : +text.selectslot = 저장슬롯을 선택하십시오. +text.slot = [accent]{0}번째 슬롯 +text.save.corrupted = [accent]세이브 파일이 손상되었거나 잘못된 파일입니다! 만약 게임을 업데이트 했다면 이것은 아마 저장 형식 변경일 것이고, 이것은 버그가 [scarlet]아닙니다[]. +text.sector.corrupted = [accent]저장 파일에서 지역을 발견했으나 불러오지 못했습니다.\n새로 생성되었습니다. +text.empty = <비어있음> +text.on = 켜기 +text.off = 끄기 +text.save.autosave = 자동저장 : {0} +text.save.map = 맵 : {0} +text.save.wave = {0}단계[] +text.save.difficulty = 난이도 : {0} +text.save.date = 마지막 저장날짜 : {0} +text.save.playtime = 플레이시간 : {0} +text.confirm = 확인 +text.delete = 삭제 +text.ok = 확인 +text.open = 열기 +text.cancel = 취소 +text.openlink = 링크 열기 +text.copylink = 링크 복사 +text.back = 뒤로가기 +text.quit.confirm = 정말로 종료하시겠습니까? +text.changelog.title = 변경사항 +text.changelog.loading = 변경사항 가져오는중... +text.changelog.error.android = [accent]게임 변경사항은 가끔 Android 4.4 이하에서 작동하지 않습니다. 이것은 내부 Android 버그 때문입니다. +text.changelog.error.ios = [accent]현재 iOS에서는 변경 사항을 지원하지 않습니다. +text.changelog.error = [scarlet]게임 변경사항을 가져오는 중 오류가 발생했습니다![]\n인터넷 연결을 확인하십시오. +text.changelog.current = [accent][[현재 버전] +text.changelog.latest = [accent][[최신 버전] +text.loading = [accent]불러오는중... +text.saving = [accent]저장중... +text.wave = [accent]{0}단계 +text.wave.waiting = 남은 시간 : [green]{0}초[] +text.waiting = [LIGHT_GRAY]대기중... +text.waiting.players = 다른 플레이어를 기다리는 중.. +text.wave.enemies = [LIGHT_GRAY]{0} 마리 남았음 +text.wave.enemy = [LIGHT_GRAY]{0} 마리 남음 +text.loadimage = 사진 불러오기 +text.saveimage = 사진 저장 +text.unknown = 알 수 없음 +text.custom = 커스텀 +text.builtin = 기본맵 +text.map.delete.confirm = 이 맵을 삭제하시겠습니까? 이 명령은 취소할 수 없습니다! +text.map.random = [accent]랜덤 맵 +text.map.nospawn = 이 맵에 플레이어가 스폰 할 코어가 없습니다! 맵 편집기에서 [ROYAL]파란색[]코어를 맵에 추가하세요. +text.map.nospawn.pvp = 이 맵에는 적팀 코어가 없습니다! 에디터에서 [scarlet]빨간팀[] 코어를 추가하세요. +text.map.invalid = 파일이 잘못되었거나 손상되어 맵을 열 수 없습니다. +text.editor.brush = 브러쉬 +text.editor.slope = \\ +text.editor.openin = 편집기 열기 +text.editor.oregen = 광물 무작위 생성 +text.editor.oregen.info = 광물 무작위 생성 : +text.editor.mapinfo = 맵 정보 +text.editor.author = 만든이 : +text.editor.description = 설명 : +text.editor.name = 이름 : +text.editor.teams = 팀 +text.editor.elevation = 지형 높이 +text.editor.errorimageload = [accent]{0}[] 파일을 불러오는데 오류가 발생했습니다. +text.editor.errorimagesave = [accent]{0}[] 파일 저장중 오류가 발생했습니다. +text.editor.generate = 생성 +text.editor.resize = 맵 크기조정 +text.editor.loadmap = 맵 불러오기 +text.editor.savemap = 맵 저장 +text.editor.saved = 저장됨! +text.editor.save.noname = 지도에 이름이 없습니다! 메뉴 -> '맵 정보' 에서 설정하세요. +text.editor.save.overwrite = 이 맵의 이름은 기존에 있던 맵을 덮어씁니다! '맵 정보' 메뉴에서 다른 이름을 선택하세요. +text.editor.import.exists = [scarlet]맵을 불러올 수 없음 : [] 기존에 있던 '{0}' 맵이 이미 존재합니다! +text.editor.import = 가져오기 +text.editor.importmap = 맵 가져오기 +text.editor.importmap.description = 이미 존재하는 맵 가져오기 +text.editor.importfile = 파일 가져오기 +text.editor.importfile.description = 외부 맵 파일 가져오기 +text.editor.importimage = 지형 사진 가져오기 +text.editor.importimage.description = 외부 맵 이미지 파일 가져오기 +text.editor.export = 내보내기 +text.editor.exportfile = 파일 내보내기 +text.editor.exportfile.description = 맵 파일 내보내기 +text.editor.exportimage = 지형 이미지 내보내기 +text.editor.exportimage.description = 맵 이미지 파일 내보내기 +text.editor.loadimage = 지형 가져오기 +text.editor.saveimage = 지형 내보내기 +text.editor.unsaved = [scarlet]변경사항을 저장하지 않았습니다![]\n정말로 나가시겠습니까? +text.editor.resizemap = 맵 크기 조정 +text.editor.mapname = 맵 이름 : +text.editor.overwrite = [accept]경고!이 명령은 기존 맵을 덮어씌우게 됩니다. +text.editor.overwrite.confirm = [scarlet]경고![] 이 이름을 가진 맵이 이미 있습니다. 덮어 쓰시겠습니까? +text.editor.selectmap = 불러올 맵 선택 : +text.width = 넓이 : +text.height = 높이 : +text.menu = 메뉴 +text.play = 플레이 +text.load = 불러오기 +text.save = 저장 +text.fps = {0}FPS +text.tps = {0}TPS +text.ping = ping : {0}ms +text.language.restart = 언어를 변경하려면 게임을 다시시작 해 주세요. +text.settings = 설정 +text.tutorial = 게임 방법 +text.editor = 편집기 +text.mapeditor = 맵 편집기 +text.donate = 기부 +text.connectfail = [crimson]{0}[accent] 서버에 연결하지 못했습니다.[] +text.error.unreachable = 서버에 연결하지 못했습니다. +text.error.invalidaddress = 잘못된 주소입니다. +text.error.timedout = 시간 초과!\n서버에 포트 포워딩이 설정되어 있고 주소가 올바른지 확인하십시오. +text.error.mismatch = 패킷 오류:\n클라이언트/서버 버전이 일치하지 않습니다.\n접속할려는 서버가 최신 버전의 Mindustry 인지 확인하세요! +text.error.alreadyconnected = 이미 접속중입니다. +text.error.mapnotfound = 맵 파일을 찾을 수 없습니다! +text.error.any = 알 수 없는 네트워크 오류. +text.settings.language = 언어 +text.settings.reset = 설정 초기화 +text.settings.rebind = 키 재설정 +text.settings.controls = 컨트롤 +text.settings.game = 게임 +text.settings.sound = 소리 +text.settings.graphics = 그래픽 +text.settings.cleardata = 게임 데이터 초기화... +text.settings.clear.confirm = 정말로 초기화 하겠습니까?\n이 작업을 되돌릴 수 없습니다! +text.settings.clearall.confirm = [scarlet]경고![]\n이 작업은 저장된 맵, 맵파일, 잠금 해제된 목록과 키 매핑, 그리고 모든 데이터를 삭제합니다.\n확인 버튼을 다시 눌러 모든 데이터를 삭제하고 게임에서 나갑니다. +text.settings.clearsectors = 지역 초기화 +text.settings.clearunlocks = 잠금 해제 초기화 +text.settings.clearall = 모두 초기화 +text.paused = 일시 정지 +text.yes = 예 +text.no = 아니오 +text.info.title = [accent]정보 +text.error.title = [crimson]오류가 발생했습니다. +text.error.crashtitle = 오류가 발생했습니다. +text.blocks.unknown = [LIGHT_GRAY]??? +text.blocks.blockinfo = 블록 정보 +text.blocks.powercapacity = 최대 전력 용량 +text.blocks.powershot = 1발당 전력 소모량 +text.blocks.targetsair = 공중공격 가능 +text.blocks.itemspeed = 유닛 이동 속도 +text.blocks.shootrange = 사거리 +text.blocks.size = 블록 크기 +text.blocks.liquidcapacity = 최대 액체 용량 +text.blocks.maxitemssecond = 최대 아이템 보관량 +text.blocks.powerrange = 전력 범위 +text.blocks.poweruse = 전력 사용 +text.blocks.powerdamage = 전력/데미지 +text.blocks.inputitemcapacity = 입력 아이템 용량 +text.blocks.outputitemcapacity = 출력 아이템 용량 +text.blocks.itemcapacity = 저장 용량 +text.blocks.basepowergeneration = 기지 전력 생성기 +text.blocks.powertransferspeed = 전력 전송량 +text.blocks.craftspeed = 생산 속도 +text.blocks.inputliquid = 사용되는 액체 +text.blocks.inputliquidaux = 보조 액체 +text.blocks.inputitem = 사용되는 아이템 +text.blocks.inputitems = 사용되는 아이템들 +text.blocks.outputitem = 출력 아이템 +text.blocks.drilltier = 드릴 +text.blocks.drillspeed = 기본 드릴 속도 +text.blocks.liquidoutput = 액체 출력 +text.blocks.liquidoutputspeed = 액체 출력속도 +text.blocks.liquiduse = 액체 사용량 +text.blocks.coolant = 냉각제 +text.blocks.coolantuse = 냉각수 사용 +text.blocks.inputliquidfuel = 연료 액 +text.blocks.liquidfueluse = 액체 연료 사용 +text.blocks.explosive = 이 블록이 터지면 주변 블록과 같이 자폭을 합니다!! +text.blocks.health = 체력 +text.blocks.inaccuracy = 오차각 +text.blocks.shots = 발포 횟수 +text.blocks.reload = 재장전 +text.blocks.inputfuel = 연료 +text.blocks.fuelburntime = 연료 연소 시간 +text.blocks.inputcapacity = 입력 용량 +text.blocks.outputcapacity = 출력 용량 +text.unit.blocks = 블록 +text.unit.powersecond = 전력/초 +text.unit.liquidsecond = 액체/초 +text.unit.itemssecond = 개/초 +text.unit.pixelssecond = 초당 픽셀 +text.unit.liquidunits = 액체 +text.unit.powerunits = 전력 +text.unit.degrees = 도 +text.unit.seconds = 초 +text.unit.items = 아이템 +text.category.general = 일반 +text.category.power = 전력 +text.category.liquids = 액체 +text.category.items = 아이템 +text.category.crafting = 제작 +text.category.shooting = 사격 +setting.autotarget.name = 자동 조준 +setting.fpscap.name = 최대 FPS +setting.fpscap.none = 없음 +setting.fpscap.text = {0} FPS +setting.difficulty.training = 훈련 +setting.difficulty.easy = 쉬움 +setting.difficulty.normal = 보통 +setting.difficulty.hard = 어려움 +setting.difficulty.insane = [#00ff00]멀[#2efe2e]티[#58fa58]플[#81f781]레[#a9f5a9]이 [#81f781]전[#58fa58]용[] +setting.difficulty.name = 난이도 : +setting.screenshake.name = 화면 흔들기 강도 +setting.effects.name = 화면 효과 +setting.sensitivity.name = 컨트롤러 감도 +setting.saveinterval.name = 자동저장 간격 +setting.seconds = {0}초 +setting.fullscreen.name = 전체 화면 +setting.fps.name = FPS 표시 +setting.vsync.name = VSync 활성화 +setting.lasers.name = 전력 노드 레이저 표시 +setting.minimap.name = 미니맵 보기 +setting.musicvol.name = 음악 크기 +setting.mutemusic.name = 음소거 +setting.sfxvol.name = 효과음 크기 +setting.mutesound.name = 소리 끄기 +setting.crashreport.name = 오류 보고서 보내기 +text.keybind.title = 조작키 설정 +category.general.name = 일반 +category.view.name = 보기 +category.multiplayer.name = 멀티플레이 +command.attack = 공격 +command.retreat = 후퇴 +command.patrol = 순찰 +keybind.press = 키를 누르세요... +keybind.press.axis = 축 또는 키를 누르세요... +keybind.move_x.name = 오른쪽/왼쪽 이동 +keybind.move_y.name = 위쪽/아래쪽 이동 +keybind.select.name = 선택 +keybind.break.name = 파괴 +keybind.deselect.name = 선택해제 +keybind.shoot.name = 사격 +keybind.zoom_hold.name = 길게눌러 확대 +keybind.zoom.name = 확대 +keybind.menu.name = 메뉴 +keybind.pause.name = 일시중지 +keybind.dash.name = 달리기 +keybind.chat.name = 채팅 +keybind.player_list.name = 플레이어 목록 +keybind.console.name = 콘솔 +keybind.rotate.name = 회전 +keybind.toggle_menus.name = 메뉴 보이기/숨기기 +keybind.chat_history_prev.name = 이전 채팅기록 +keybind.chat_history_next.name = 다음 채팅기록 +keybind.chat_scroll.name = 채팅 스크롤 +keybind.drop_unit.name = 유닛 드롭 +keybind.zoom_minimap.name = 미니맵 확대 +mode.text.help.title = 도움말 +mode.waves.name = 단계 +mode.waves.description = 이것은 일반 모드입니다. 제한된 자원과 자동으로 다음 단계가 시작됩니다. +mode.sandbox.name = 샌드박스 +mode.sandbox.description = 무한한 자원과 다음단계 시작을 위한 타이머가 없습니다. +mode.freebuild.name = 자유 건축 +mode.freebuild.description = 제한된 자원과 다음단계 시작을 위한 타이머가 없습니다. +mode.pvp.name = PvP +mode.pvp.description = 몹이 아닌 실제 플레이어와 PvP를 합니다. +content.item.name = 아이템 +content.liquid.name = 액체 +content.unit.name = 유닛 +content.recipe.name = 블록 +content.mech.name = 기체 +item.stone.name = 돌 +item.stone.description = 주로 용암을 사용하여 얻을 수 있는 자원입니다. +item.copper.name = 구리 +item.copper.description = 모든 유형의 블록에서 광범위하게 사용되는 자원입니다. +item.lead.name = 납 +item.lead.description = 쉽게 구할 수 있으며, 전자 및 액체 수송 블록에서 광범위하게 사용되는 자원입니다. +item.coal.name = 석탄 +item.coal.description = 쉽게 구할 수 있으며, 주로 제련소 등에서 연료로 사용됩니다. +item.dense-alloy.name = 고밀도 합금 +item.dense-alloy.description = 납과 구리로 만든 튼튼한 고밀도 합금.\n고급 수송 블록이나 상위 티어 블록을 건설하는데 사용됩니다. +item.titanium.name = 티타늄 +item.titanium.description = 파이프 재료나 고급 드릴, 비행기/기체 등에서 재료로 사용되는 자원입니다. +item.thorium.name = 토륨 +item.thorium.description = 건물의 재료, 포탑의 탄약 또는 핵연료로 사용되는 방사성 금속입니다. +item.silicon.name = 실리콘 +item.silicon.description = 매우 유용한 반도체로, 태양 전지판과 복잡한 전자 제품에 사용할 수 있습니다. +item.plastanium.name = 플라스터늄 +item.plastanium.description = 고급 항공기 및 분열 탄약에 사용되는 가벼운 연성 재료. +item.phase-fabric.name = 메타 +item.phase-fabric.description = 최첨단 전자 제품과 자기수리 기술에 사용되는 거의 무중력에 가까운 물질입니다. +item.surge-alloy.name = 설금 +item.surge-alloy.description = 주로 건물의 재료로 사용되는 자원입니다 +item.biomatter.name = 바이오메터 +item.biomatter.description = 이것은 유기농 덤불입니다!\n압축기에 넣어 석유로 바꿀 수 있습니다. +item.sand.name = 모래 +item.sand.description = 고밀도 합금이나 플럭스 등에서 제련시 광범위하게 사용되는 일반적인 재료입니다. +item.blast-compound.name = 폭발물 +item.blast-compound.description = 포탑 및 건설의 재료로 사용되는 휘발성 폭발물.\n연료로도 사용할 수 있지만, 별로 추천하지는 않습니다. +item.pyratite.name = 피라테 +item.pyratite.description = 폭발성을 가진 재료로, 주로 포탑의 탄약으로 사용됩니다. +liquid.water.name = 물 +liquid.lava.name = 용암 +liquid.oil.name = 석유 +liquid.cryofluid.name = 냉각수 +mech.alpha-mech.name = 알파 +mech.alpha-mech.weapon = 중무장 소총 +mech.alpha-mech.ability = 드론 소환 +mech.alpha-mech.description = 표준 기체.\n적절한 속도와 공격력을 갖추고 있으며, 공격 능력을 높이기 위해 최대 3대의 드론을 만들 수 있습니다. +mech.delta-mech.name = 델타 +mech.delta-mech.weapon = 전격 생산기 +mech.delta-mech.ability = 충전 +mech.delta-mech.description = 빠르게 이동하는 적을 처치하기 위한 가벼운 기체.\n구조물에는 거의 피해를 주지 않지만, 전격 무기를 사용하여 많은 적군을 매우 빠르게 죽일 수 있습니다. +mech.tau-mech.name = 타우 +mech.tau-mech.weapon = 건물 수리총 +mech.tau-mech.ability = 유닛 치료 +mech.tau-mech.description = 지원형 기체.\n총을 발사하여 건물을 치료하고 회복 능력 사용으로 화재를 진압하거나, 반경 내 아군을 치유시킵니다. +mech.omega-mech.name = 오메가 +mech.omega-mech.weapon = 전방 유도미사일 +mech.omega-mech.ability = 방어모드 +mech.omega-mech.description = 지상 기체 최종판이자 건물 파괴용으로 적합한 부피가 크고 튼튼한 기체. 방어 모드는 최대 90% 의 피해를 줄일 수 있습니다. +mech.dart-ship.name = 다트 +mech.dart-ship.weapon = 소총 +mech.dart-ship.description = 표준 비행선. 빠르고 가볍지만 공격력이 거의 없고 채광 속도가 느립니다. +mech.javelin-ship.name = 자비린 +mech.javelin-ship.description = 치고 빠지는 공격을 위한 비행선. 처음에는 느리지만, 가속도가 붙어 엄청난 속도로 미사일 피해를 입힐 수 있으며, 전격 능력을 사용할 수 있습니다. +mech.javelin-ship.weapon = 유도 미사일 +mech.javelin-ship.ability = 가속 전격 생성기 +mech.trident-ship.name = 삼지창 +mech.trident-ship.description = 대형 공중 폭격기. 당연하게도 엄청 단단합니다. +mech.trident-ship.weapon = 폭탄 저장고 +mech.glaive-ship.name = 글레브 +mech.glaive-ship.description = 크고 잘 무장된 총을 가진 비행선. 방화용 리피터가 장착되어 있으며, 가속도와 최대속도가 높습니다. +mech.glaive-ship.weapon = 방화총 +text.item.explosiveness = [LIGHT_GRAY]폭발력 : {0} +text.item.flammability = [LIGHT_GRAY]인화성 : {0} +text.item.radioactivity = [LIGHT_GRAY]방사능 : {0} +text.item.fluxiness = [LIGHT_GRAY]플럭스 파워 : {0} +text.unit.health = [LIGHT_GRAY]체력 : {0} +text.unit.speed = [LIGHT_GRAY]속도 : {0} +text.mech.weapon = [LIGHT_GRAY]무기 : {0} +text.mech.armor = [LIGHT_GRAY]방어력 : {0} +text.mech.itemcapacity = [LIGHT_GRAY]아이템 수용 용량 : {0} +text.mech.minespeed = [LIGHT_GRAY]채광 속도 : {0} +text.mech.minepower = [LIGHT_GRAY]채광 레벨 : {0} +text.mech.ability = [LIGHT_GRAY]능력 : {0} +text.liquid.heatcapacity = [LIGHT_GRAY]발열량 : {0} +text.liquid.viscosity = [LIGHT_GRAY]점도 : {0} +text.liquid.temperature = [LIGHT_GRAY]온도 : {0} +block.constructing = {0}[LIGHT_GRAY](만드는중) +block.spawn.name = 적 스폰지점 +block.core.name = 코어 +block.metalfloor.name = 철판 +block.deepwater.name = 깊은물 +block.water.name = 물 +block.lava.name = 용암 +block.tar.name = 타르 +block.blackstone.name = 검은돌 +block.stone.name = 돌 +block.dirt.name = 흙 +block.sand.name = 모래 +block.ice.name = 얼음 +block.snow.name = 눈 +block.grass.name = 잔디 +block.shrub.name = 관목 +block.rock.name = 바위 +block.blackrock.name = 검은바위 +block.icerock.name = 얼음바위 +block.copper-wall.name = 구리벽 +block.copper-wall-large.name = 큰 구리벽 +block.dense-alloy-wall.name = 합금 벽 +block.dense-alloy-wall-large.name = 큰 합금 벽 +block.phase-wall.name = 메타벽 +block.phase-wall-large.name = 큰 메타벽 +block.thorium-wall.name = 토륨벽 +block.thorium-wall-large.name = 대형 토륨벽 +block.door.name = 문 +block.door-large.name = 대형문 +block.duo.name = 듀오 +block.scorch.name = 스코치 +block.hail.name = 헤일 +block.lancer.name = 랜서 +block.conveyor.name = 컨베이어 +block.titanium-conveyor.name = 티타늄 컨베이어 +block.junction.name = 교차기 +block.router.name = 분배기 +block.distributor.name = 대형 분배기 +block.sorter.name = 필터 +block.sorter.description = 아이템을 넣어서 필터에 설정된 아이템일 경우 바로 앞으로 통과하며, 그렇지 않을 경우 옆으로 통과합니다. +block.overflow-gate.name = 오버플로 게이트 +block.overflow-gate.description = 정면으로 가는 자원이 막히면 옆으로 출력하고, 그렇지 않으면 계속 정면으로 출력합니다. +block.smelter.name = 제련소 +block.arc-smelter.name = 대형 제련소 +block.silicon-smelter.name = 실리콘 제련소 +block.phase-weaver.name = 메타 합성기 +block.pulverizer.name = 분쇄기 +block.cryofluidmixer.name = 냉각수 제조기 +block.melter.name = 융해기 +block.incinerator.name = 소각로 +block.biomattercompressor.name = 바이오메터 압축기 +block.separator.name = 셉터 +block.centrifuge.name = 원심 분리기 +block.power-node.name = 전력 송신기 +block.power-node-large.name = 대형 전력 송신기 +block.battery.name = 배터리 +block.battery-large.name = 대형 배터리 +block.combustion-generator.name = 석탄 발전기 +block.turbine-generator.name = 터빈 발전기 +block.mechanical-drill.name = 기계식 드릴 +block.pneumatic-drill.name = 강철 드릴 +block.laser-drill.name = 레이저 드릴 +block.water-extractor.name = 물 추출기 +block.cultivator.name = 온실 +block.alpha-mech-pad.name = 알파 기체 패드 +block.dart-ship-pad.name = 다트 비행선 패드 +block.delta-mech-pad.name = 델타 기체 패드 +block.javelin-ship-pad.name = 자비린 비행선 패드 +block.trident-ship-pad.name = 삼지창 비행선 패드 +block.glaive-ship-pad.name = 글레브 비행선 패드 +block.omega-mech-pad.name = 오메가 기체 패드 +block.tau-mech-pad.name = 타우 기체 패드 +block.conduit.name = 파이프 +block.mechanical-pump.name = 기계식 펌프 +block.itemsource.name = 아이템 소스 +block.itemvoid.name = 아이템 삭제 장치 +block.liquidsource.name = 무한 액체공급 장치 +block.powervoid.name = 방전장치 +block.powerinfinite.name = 무한 전력공급 장치 +block.unloader.name = 언로더 +block.vault.name = 창고 +block.wave.name = 파도 +block.swarmer.name = 스웜 +block.salvo.name = 살보 +block.ripple.name = 립플 +block.phase-conveyor.name = 메타 컨베이어 +block.bridge-conveyor.name = 터널 +block.plastanium-compressor.name = 플라스터늄 압축기 +block.pyratite-mixer.name = 피라테 제조기 +block.blast-mixer.name = 폭발물 제조기 +block.solidifer.name = 고체 +block.solar-panel.name = 태양 전지판 +block.solar-panel-large.name = 대형 태양 전지판 +block.oil-extractor.name = 석유 추출기 +block.spirit-factory.name = 스피릿 드론 공장 +block.phantom-factory.name = 팬텀 드론 공장 +block.wraith-factory.name = 유령 전투기 공장 +block.ghoul-factory.name = 구울 폭격기 공장 +block.dagger-factory.name = 디거 기체 공장 +block.titan-factory.name = 타이탄 기체 공장 +block.fortress-factory.name = 포트리스 기체 공장 +block.revenant-factory.name = 레비던트 전투기 공장 +block.repair-point.name = 정비소 +block.pulse-conduit.name = 퓨즈 파이프 +block.phase-conduit.name = 메타 파이프 +block.liquid-router.name = 액체 분배기 +block.liquid-tank.name = 물탱크 +block.liquid-junction.name = 액체 교차기 +block.bridge-conduit.name = 다리 파이프 +block.rotary-pump.name = 동력 펌프 +block.thorium-reactor.name = 토륨 원자로 +block.command-center.name = 명령 본부 +block.mass-driver.name = 물질 이동기 +block.blast-drill.name = 고속 발열 드릴 +block.thermal-pump.name = 화력 펌프 +block.thermal-generator.name = 열발전기 +block.alloy-smelter.name = 설금 제련소 +block.mend-projector.name = 수리 프로젝터 +block.surge-wall.name = 설금벽 +block.surge-wall-large.name = 큰 설금벽 +block.cyclone.name = 사이클론 +block.fuse.name = 퓨즈 +block.shock-mine.name = 전격 지뢰 +block.overdrive-projector.name = 오버드라이브 프로젝터 +block.force-projector.name = 보호막 프로젝터 +block.arc.name = Arc +block.rtg-generator.name = 토륨 발전소 +block.spectre.name = 스펙터 +block.meltdown.name = 멜트다운 +block.container.name = 컨테이너 +block.core.description = 게임에서 가장 중요한 건물.\n파괴되면 게임이 끝납니다. +team.blue.name = 블루팀 +team.red.name = 레드팀 +team.orange.name = 오렌지팀 +team.none.name = 공기팀 +team.green.name = 그린팀 +team.purple.name = 보라색팀 +unit.alpha-drone.name = 알파 드론 +unit.spirit.name = 스피릿 드론 +unit.spirit.description = 기본 드론 유닛. 기본적으로 코어에서 1개가 스폰됩니다. 자동으로 채광하며 아이템을 수집하고, 블록을 수리합니다. +unit.phantom.name = 팬텀 드론 +unit.phantom.description = 첨단 드론 유닛. 광석을 자동으로 채광하며, 아이템을 수집하고 블록을 수리합니다. 일반 드론보다 훨씬 효과적입니다. +unit.dagger.name = 디거 +unit.dagger.description = 기본 지상 유닛입니다. 스웜과 같이 쓰면 유용합니다. +unit.titan.name = 타이탄 +unit.titan.description = 고급 지상 유닛입니다. 고밀도 합금을 탄약으로 사용하며 지상과 공중 둘다 공격할 수 있습니다. +unit.ghoul.name = 구울 폭격기 +unit.ghoul.description = 무거운 지상 폭격기 입니다. 폭발물 또는 피라테를 탄약으로 사용합니다. +unit.wraith.name = 유령 전투기 +unit.wraith.description = 코어를 집중적으로 공격하는 방식을 사용하는 전투기 입니다. +unit.fortress.name = 포트리스 +unit.fortress.description = 중포 지상 유닛. 높은 공격력과 체력을 가지고 있습니다. +unit.revenant.name = 레비던트 +unit.revenant.description = 대형 레이저를 발사하는 공중 유닛입니다. +tutorial.begin = 플레이어의 주요 목표는 [LIGHT_GRAY]적군[]을 제거하는 것입니다.\n\n이 게임은 [accent]구리를 채광[]하는 것으로 시작합니다.\n이것을 하기 위해 플레이어의 중심부 근처에 있는 구리 광맥을 누르세요. +tutorial.drill = 수동으로 채광하는 것은 효율이 낮습니다.\n[accent]드릴[]은 자동으로 채광 작업을 합니다.\n구리 광맥에 표시된 영역에 드릴을 하나를 놓으세요. +tutorial.conveyor = [accent]컨베이어[]를 사용하여 아이템을 코어로 운반합니다.\n드릴에서 코어까지 컨베이어 라인을 만드세요. +tutorial.morecopper = 더 많은 구리가 필요합니다.\n\n수동으로 채광하거나, 드릴을 더 설치하세요. +tutorial.turret = 방어 구조물은 [LIGHT_GRAY]적[]을 물리치기 위해 반드시 필요합니다.\n기지 근처에 듀오 터렛을 설치하세요. +tutorial.drillturret = 듀오 터렛이 작동하기 위해서는[accent] 구리 탄약 []을 필요로 합니다.\n터렛 옆에 드릴을 설치하여 구리를 공급하세요. +tutorial.waves = [LIGHT_GRAY]적[]이 접근합니다.\n\n2단계 동안 코어를 보호하고 더 많은 터렛을 만드세요. +tutorial.lead = 더 많은 광석을 이용할 수 있습니다. [accent]납[]을 찾아 탐색하세요.\n\n아이템을 코어로 전송할려면 플레이어 기체 또는 비행기에서 코어로 드래그 하세요. +tutorial.smelter = 구리와 납은 약한 금속입니다.\n[accent]고밀도 합금[]은 제련소에서 만들 수 있습니다.\n\n하나 만드세요. +tutorial.densealloy = 이 제련소는 이제 고밀도 합금을 생산할 것입니다.\n몇개 더 생산하세요.\n필요한 경우 더 만드세요. +tutorial.siliconsmelter = 이제 이코어는 채굴과 수리하기 위한[accent] 스피릿 드론[]을 생성 할 것 입니다.\n\n[accent]실리콘[]을 사용해 다른 유닛을 생성하기 위한 공장을 만들 수 있습니다.\n실리콘 제련기를 제작하세요! +tutorial.silicondrill = 실리콘을 제작하려면[accent] 석탄[] 과[accent] 모래[]가 필요합니다.\n드릴을 먼저 건설해보는건 어떤가요? +tutorial.generator = 이 건물은 [LIGHT_YELLOW]전력[]이 필요합니다.\n[accent] 석탄 발전기[]를 건설하세요. +tutorial.generatordrill = [accent] 석탄 발전기[]는 연료가 필요합니다.\n[accent] 석탄[]을 드릴로 채굴해서 연료를 체워주세요. +tutorial.node = 전력은 송신해줄 송신기가 필요합니다.\n[accent] 전력 송신기[]를 석탄 등등 발전기 옆에 설치해서 생산된 전기를 다른곳으로 송신합시다. +tutorial.nodelink = 전력은 전력 블록과 발전기에 연결하거나, 연결된 전력 송신기를 통해 전송이 가능합니다. \n\n전력 송신기를 누르고 발전기와 실리콘 제련기를 선택하여 전원을 연결합시다. +tutorial.silicon = 실리콘이 생산되고 있습니다.\n\n생산 시스템의 개선을 권고 드립니다. +tutorial.daggerfactory = 이[accent] 디거 기체 공장[]은\n\n공격하는 기체를 생산하기 위해 사용됩니다. +tutorial.router = 공장을 작동시키기 위해 자원이 필요합니다.\n컨베이어에 운반되고 있는 자원을 분할할 분배기를 만드세요. +tutorial.dagger = 전력 노드를 공장에 연결하세요.\n일단 요구 사항이 충족되면 기체 생산을 시작합니다.\n\n필요에 따라 드릴 및 발전기, 컨베이어를 더 많이 만들 수 있습니다. +tutorial.battle = [LIGHT_GRAY]적[]의 코어가 드러났습니다.\n당신의 부대와 디거를 사용하여 파괴하세요. +block.copper-wall.description = 구리로 만든 벽. +block.copper-wall-large.description = 구리로 만든 큰 벽. +block.dense-alloy-wall.description = 고밀도 합금으로 만든 벽. 구리벽보다 체력이 높습니다. +block.dense-alloy-wall-large.description = 고밀도 합금으로 만든 큰 벽. +block.thorium-wall.description = 토륨으로 만든 벽. +block.thorium-wall-large.description = 토륨으로 만든 큰 벽. +block.phase-wall.description = 날라오는 모든 총알을 튕겨내고 데미지를 입는 특수한 벽입니다. +block.phase-wall-large.description = 메타로 제작한 큰 벽. 날라오는 총알을 모두 튕겨냅니다. +block.surge-wall.description = 데미지를 입으면 번개를 일으켜 대상에게 피해를 입히는 특수한 벽입니다. +block.surge-wall-large.description = 설금을 재료로 한 큰 벽.\n데미지를 입으면 번개를 일으켜 대상에게 피해를 입힙니다. +block.door.description = 유닛이 지나갈 수 있도록 만든 문. 클릭하면 열고 닫습니다. +block.door-large.description = 유닛이 자나갈 수 있도록 만든 큰 문. 클릭하면 열고 닫습니다. +block.mend-projector.description = 주위 건물을 치료하는 건물입니다. +block.overdrive-projector.description = 범위 내 모든 행동의 속도를 높여주는 보조형 건물입니다. +block.force-projector.description = 보호막을 생성하는 건물.\n기본적으로 전력만 있으면 작동하지만, 메타를 넣어 보호막의 범위를 크게 확장시킬 수 있습니다. +block.shock-mine.description = 적이 이 블록을 지나가면 전격 공격을 하는 함정형 방어 건물입니다. +block.duo.description = 범용성을 가진 터렛.\n지상 및 공중공격을 하며, 초중반에 유용합니다. +block.arc.description = 목표 방향으로 전격 공격을 하는 포탑입니다. +block.hail.description = 장거리 지상 공격을 하는 터렛입니다.\n적이 오기 전에 쓸어버릴 수 있습니다. +block.lancer.description = 중거리 레이져 포탑입니다.\n적을 관통하기 때문에 뭉쳐있는 적들에게 매우 효과적입니다. +block.wave.description = 적이 있는 자리에 액체를 뿌립니다.\n이 포탑을 활용하여 액체를 뿌린 곳에 불을 붙이거나 적을 느리게 할 수 있습니다. +block.salvo.description = 명중률이 높고, 3발씩 끊어 발사하는 포탑입니다. +block.swarmer.description = 4발씩 끊어서 유도체를 발사하는 포탑입니다 +block.ripple.description = 4개의 탄약으로 나눠 발사하여 명중률이 낮지만, 사거리가 매우 긴 포탑입니다. +block.cyclone.description = 낮은 명중률과 높은 RPM 을 가진 포탑입니다.\n탄약이 남아있는 한 멈추지 않고 계속 연사합니다. +block.fuse.description = 단거리에서 범위형 레이저를 발사하는 포탑입니다. +block.spectre.description = 높은 명중률과 RPM 을 가진 포탑입니다.\n탄약이 남아있는 한 멈추지 않고 계속 연사합니다. +block.meltdown.description = 목표를 따라 초대형 레이져를 발사하는 포탑입니다.\n뭉쳐있는 몹에게 매우 효과가 좋습니다. +block.conveyor.description = 느린 속도로 자원을 수송할 수 있는 컨베이어. +block.titanium-conveyor.description = 빠른 속도로 자원을 수송할 수 있는 컨베이어. +block.phase-conveyor.description = 자원을 순간이동 시켜 주는 컨베이어 입니다. +block.junction.description = 컨베이어를 교차시켜 자원을 수송할 때 사용할 수 있는 블록입니다. +block.mass-driver.description = 자원을 받아서 다른 물질 이동기로 전달할 수 있는 블록입니다.\n엄청난 사거리를 가지고 있으며, 주로 컨베이어가 접근할 수 없는 곳에 유용하게 사용됩니다. +block.smelter.description = 고밀도 합금을 제작할 수 있는 건물입니다. +block.arc-smelter.description = 고밀도 합금을 제작할 수 있는 건물이지만, 이 건물은 석탄이 필요 없고 좀더 빠른 속도로 합금을 생산해낼 수 있습니다. +block.silicon-smelter.description = 실리콘을 제작할 수 있는 건물입니다. +block.plastanium-compressor.description = 플라스터늄을 제조할 수 있는 건물입니다. +block.phase-weaver.description = 메타를 제작할 수 있는 건물입니다. +block.alloy-smelter.description = 설금을 제작할 수 있는 건물입니다. +block.pulverizer.description = 돌을 갈아서 모래로 만들 수 있는 건물입니다. +block.pyratite-mixer.description = 피라테를 제조할 수 있는 건물입니다. +block.blast-mixer.description = 폭발물을 제조할 수 있는 건물입니다. +block.cryofluidmixer.description = 냉각수를 제작할 수 있는 건물입니다. +block.solidifer.description = 용암을 돌로 만들 수 있는 건물입니다. +block.melter.description = 돌로 용암을 만들 수 있는 건물입니다. +block.incinerator.description = 불필요한 아이템을 소각시켜 줄 수 있는 건물입니다. +block.biomattercompressor.description = 잔디밭에서 바이오메터를 추출할 수 있는 건물입니다. +block.separator.description = 돌을 분해하여 각종 자원으로 재활용 할 수 있게 해 주는 건물입니다. +block.centrifuge.description = 돌을 분해하여 각종 자원으로 재활용 할 수 있게 해 주는 건물이지만, 이 건물은 좀 더 다양한 자원을 얻을 수 있게 해 줍니다. +block.power-node.description = 생성된 전력를 다른 건물로 전달하기 위한 전력 노드입니다. +block.power-node-large.description = 생성된 전력를 다른 건물로 전달하기 위한 건물이며, 일반 노드보다 더 많은 전력을 이동시킬 수 있습니다. +block.battery.description = 흔히 아는 충전식 배터리입니다.\n전력을 사용하는 건물에 전력이 떨어질경우, 이 배터리를 전력 노드에 연결하면 이 배터리에 저장된 전력을 소모하여 지속적으로 공급할 수 있습니다. +block.battery-large.description = 일반 배터리보다 용량이 매우 커진 커진 배터리. +block.combustion-generator.description = 석탄을 연료로 전력를 생산해내는 발전소 입니다. +block.turbine-generator.description = 석탄 발전기보다 더 많은량의 전력를 생산하는 발전기입니다. +block.thermal-generator.description = 용암을 원료로 전력을 생산할 수 있는 발전소입니다. +block.solar-panel.description = 태양열을 받아 자기 스스로 전력을 생산하는 건물입니다. +block.solar-panel-large.description = 태양열을 받아 자기 스스로 전력을 생산하지만, 이 블록은 더 빨리 전력을 생산할 수 있습니다. +block.thorium-reactor.description = 토륨을 원료로 하는 토륨 원자로 입니다.\n많은 전력을 생산하지만 엄청난 열을 발생시키기 때문에, 많은 량의 물 또는 냉각수가 있어야 터지지 않고 작동합니다. +block.rtg-generator.description = 냉각은 필요 없지만 토륨 원자로보다 적은량의 전력을 생산하는 방사선 동위원소 열전자 발전기. +block.unloader.description = 해당 창고 및 코어에서 자원을 빼내는데 사용됩니다. +block.container.description = 아이템을 임시로 저장할 수 있는 소형 창고입니다. +block.vault.description = 아이템을 임시로 저장할 수 있는 대형 창고입니다. +block.mechanical-drill.description = 구리로 제작할 수 있는 기본 드릴입니다. +block.pneumatic-drill.description = 돌, 티타늄을 채광할 수 있는 고급 드릴입니다. +block.laser-drill.description = 토륨을 채광할 수 있는 최고급 드릴입니다.\n전력과 물을 공급하여 빠른 속도로 채광할 수 있습니다. +block.blast-drill.description = 최상위 드릴입니다. 엄청난 양의 전력과 물을 소모하는 대신, 매우 빠른 속도로 채광합니다. +block.water-extractor.description = 바닥에서 물을 추출하여 건물에 공급할 수 있는 건물입니다. +block.cultivator.description = 잔디에서 바이오메터를 추출할 수 있는 건물입니다. +block.oil-extractor.description = 석유를 추출 해 주는 건물입니다. +block.dart-ship-pad.description = 다트 비행선으로 바꿀 수 있는 패드입니다. +block.trident-ship-pad.description = 삼지창 비행선으로 바꿀 수 있는 패드입니다. +block.javelin-ship-pad.description = 자비린 비행선으로 바꿀 수 있는 패드입니다. +block.glaive-ship-pad.description = 글레브 비행선으로 바꿀 수 있는 패드입니다. +block.tau-mech-pad.description = 타우 기체로 바꿀 수 있는 패드 +block.delta-mech-pad.description = 델타 기체로 바꿀 수 있는 패드입니다. +block.omega-mech-pad.description = 오메가 기체로 바꿀 수 있는 패드 +block.spirit-factory.description = 스피릿 유닛을 생산하는 공장입니다. +block.phantom-factory.description = 유닛 팬텀을 생산하는 공장입니다. +block.wraith-factory.description = 유닛 유령 전투기를 소환하는 공장입니다. +block.ghoul-factory.description = 구울 유닛을 생산하는 공장입니다. +block.dagger-factory.description = 디거를 생산하는 공장입니다. +block.titan-factory.description = 타이탄 유닛을 생산할 수 있는 공장입니다. +block.fortress-factory.description = 포트리스를 생산하는 공장입니다. +block.revenant-factory.description = 레비던트 유닛을 생산할 수 있는 공장입니다. +block.repair-point.description = 근처 유닛들을 수리하는 건물입니다. +block.command-center.description = 생산된 유닛들을 제어할 수 있는 건물.\n첫번째 버튼은 적 기지로 공격하며, 두번째는 대기 상태, 세번째는 기지 근처를 돌며 정찰합니다. +block.conduit.description = 일반 파이프. 액체가 지나갈 수 있도록 해 줍니다. +block.pulse-conduit.description = 티타늄으로 만들어 졌으며, 일반 파이프보다 액체 수용량이 높습니다. +block.phase-conduit.description = 물을 먼거리로 순간이동 시켜 주는 장치입니다. +block.liquid-router.description = 물펌프를 다른 방향으로 분배할 수 있게 하는 블럭입니다. +block.liquid-tank.description = 액체 종류를 저장할 수 있는 물탱크 입니다. +block.liquid-junction.description = 물펌프와 다른 물펌프를 서로 교차시키게 할 수 있는 블럭입니다. +block.bridge-conduit.description = 다리와 다리 사이를 연결하여 액체가 지나갈 수 있게 해 줍니다.\n주로 다리 사이에 지나갈 수 없는 장애물이 있을 때 사용합니다. +block.mechanical-pump.description = 구리로 제작할 수 있는 기계식 물펌프입니다. +block.rotary-pump.description = 일반 물 펌프보다 더 빠른 속도로 물을 끌어올릴 수 있는 펌프입니다. +block.thermal-pump.description = 기계식 펌프보다 3배 빠른 속도로 액체를 퍼올릴 수 있는 펌프이며, 용암도 퍼올릴 수 있는 유일한 펌프입니다. +block.router.description = 한 방향에서 아이템을 받은 후 최대 3개의 다른 방향으로 동일하게 출력합니다.\n재료를 한곳에서 여러 대상으로 분할하여 운반하는데 유용합니다. +block.distributor.description = 아이템을 최대 7개의 다른 방향으로 똑같이 분할하는 고급 분배기. +block.bridge-conveyor.description = 고급 자원 수송 블록.\n지형이나 건물을 넘어 최대 3개 타일을 건너뛰고 자원을 운송할 수 있습니다. +block.alpha-mech-pad.description = 알파 기체로 바꿀 수 있는 패드입니다. +block.itemsource.description = 자원을 선택하면 그 자원이 무한하게 생성되는 블록입니다. +block.liquidsource.description = 무한한 액체를 출력해냅니다. +block.itemvoid.description = 아이템을 사라지게 만듭니다. +block.powerinfinite.description = 무한한 전력을 공급해주는 블록입니다. +block.powervoid.description = 설정된 아이템을 계속해서 출력하는 블록입니다. +liquid.water.description = 지상 유닛이 이 위를 지나가면 이동속도가 느려지고, 깊은 물에 빠지면 죽습니다. +liquid.lava.description = 지상 유닛이 이 위를 지나가면 이동속도가 매우 느려지고, 지속적으로 데미지를 입습니다. +liquid.oil.description = 일부 조합 블록에서 사용되는 자원입니다. +liquid.cryofluid.description = 포탑 및 토륨 원자로에서 사용되는 자원입니다. diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index fe40ac1fe6..066ed3dda9 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -286,6 +286,7 @@ text.no = Nie ma mowy! text.info.title = [accent]Informacje text.error.title = [crimson]Wystąpił błąd text.error.crashtitle = Wystąpił błąd +text.blocks.unknown = [LIGHT_GRAY]??? text.blocks.blockinfo = Informacje o bloku text.blocks.powercapacity = Pojemność mocy text.blocks.powershot = moc / strzał @@ -359,7 +360,6 @@ setting.sensitivity.name = Czułość kontrolera setting.saveinterval.name = Interwał automatycznego zapisywania setting.seconds = Sekundy setting.fullscreen.name = Pełny ekran -setting.multithread.name = Wielowątkowość setting.fps.name = Widoczny licznik FPS setting.vsync.name = Synchronizacja pionowa setting.lasers.name = Pokaż lasery zasilające @@ -404,8 +404,6 @@ mode.waves.name = Fale mode.waves.description = Normalny tryb. Normalne surowce i fale. mode.sandbox.name = sandbox mode.sandbox.description = Nieskończone surowce i fale bez odliczania. Dla przedszkolaków! -mode.custom.warning = Note that blocks cannot be used in custom games until they are unlocked in sectors.\n\n[LIGHT_GRAY]If you have not unlocked any blocks, none will appear. -mode.custom.warning.read = Just to make sure you've read it:\n[scarlet]UNLOCKS IN CUSTOM GAMES DO NOT CARRY OVER TO SECTORS OR OTHER MODES!\n\n[LIGHT_GRAY](I wish this wasn't necessary, but apparently it is) mode.freebuild.name = budowanie mode.freebuild.description = Normalne surowce i fale bez odliczania. mode.pvp.name = PvP diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index 0550933b49..faeec32d48 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -286,6 +286,7 @@ text.no = Não text.info.title = [accent]Informação text.error.title = [crimson]Ocorreu um Erro. text.error.crashtitle = Ocorreu um Erro +text.blocks.unknown = [LIGHT_GRAY]??? text.blocks.blockinfo = Informação do Bloco text.blocks.powercapacity = Capacidade de Energia text.blocks.powershot = Energia/tiro @@ -359,7 +360,6 @@ setting.sensitivity.name = Sensibilidade do Controle setting.saveinterval.name = Intervalo de autosalvamento setting.seconds = {0} Segundos setting.fullscreen.name = Tela Cheia -setting.multithread.name = Multithreading setting.fps.name = Mostrar FPS setting.vsync.name = VSync setting.lasers.name = Mostrar lasers @@ -404,8 +404,6 @@ mode.waves.name = hordas mode.waves.description = O modo normal. Recursos limitados E os ataques vem automaticamente. mode.sandbox.name = sandbox mode.sandbox.description = Recursos infinitos E sem tempo para Ataques. -mode.custom.warning = Note that blocks cannot be used in custom games until they are unlocked in sectors.\n\n[LIGHT_GRAY]If you have not unlocked any blocks, none will appear. -mode.custom.warning.read = Just to make sure you've read it:\n[scarlet]UNLOCKS IN CUSTOM GAMES DO NOT CARRY OVER TO SECTORS OR OTHER MODES!\n\n[LIGHT_GRAY](I wish this wasn't necessary, but apparently it is) mode.freebuild.name = construção \nlivre mode.freebuild.description = recursos limitados e Sem tempo para Ataques. mode.pvp.name = PvP diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 478dc8dbbf..55866c439f 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -286,6 +286,7 @@ text.no = Нет text.info.title = Информация text.error.title = [crimson]Произошла ошибка text.error.crashtitle = Произошла ошибка +text.blocks.unknown = [LIGHT_GRAY]??? text.blocks.blockinfo = Информация о блоке text.blocks.powercapacity = Вместимость энергии text.blocks.powershot = Энергия/выстрел @@ -359,7 +360,6 @@ setting.sensitivity.name = Чувствительность контроллер setting.saveinterval.name = Интервал автосохранения setting.seconds = {0} Секунд setting.fullscreen.name = Полноэкранный режим -setting.multithread.name = Многопоточность (TPS) setting.fps.name = Показывать FPS setting.vsync.name = Верт. синхронизация setting.lasers.name = Показывать энергетические лазеры @@ -404,8 +404,6 @@ mode.waves.name = Волны mode.waves.description = В режиме "волны" ограниченные ресурсы и автоматические наступающие волны. mode.sandbox.name = Песочница mode.sandbox.description = Бесконечные ресурсы и нет таймера для волн, но можно самим вызвать волну. -mode.custom.warning = [scarlet]РАЗБЛОКИРОВАННОЕ В ПОЛЬЗОВАТЕЛЬСКИХ ИГРАХ ИЛИ НА СЕРВЕРАХ НЕ СОХРАНЯЕТСЯ[]\n\nИграйте в секторах для разблокировки чего-либо -mode.custom.warning.read = Внимательно прочитайте это!:\n[scarlet]РАЗБЛОКИРОВАННОЕ В ПОЛЬЗОВАТЕЛЬСКИХ ИГРАХ ИЛИ ДРУГИХ РЕЖИМАХ ИГРЫ НЕ РАСПРОСТРАНЯЕТСЯ НА СЕКТОРА ИЛИ ДРУГИЕ РЕЖИМЫ ИГРЫ!\n\n[LIGHT_GRAY](Я бы хотел, чтобы это не было необходимо, но, по-видимому, это так) mode.freebuild.name = Свободная\nстройка mode.freebuild.description = ограниченные ресурсы и нет таймера для волн. mode.pvp.name = Противо-\nстояние diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties index a93ca6ec6e..ec75564ec0 100644 --- a/core/assets/bundles/bundle_tk.properties +++ b/core/assets/bundles/bundle_tk.properties @@ -286,6 +286,7 @@ text.no = Hayir text.info.title = [accent]Bilgi text.error.title = [crimson]Bir hata olustu text.error.crashtitle = Bir hata olustu +text.blocks.unknown = [LIGHT_GRAY]??? text.blocks.blockinfo = Yapi bilgisi text.blocks.powercapacity = Guc kapasitesi text.blocks.powershot = Guc/Saldiri hizi @@ -359,7 +360,6 @@ setting.sensitivity.name = Kumanda hassasligi setting.saveinterval.name = Otomatik kaydetme suresi setting.seconds = {0} Saniye setting.fullscreen.name = Tam ekran -setting.multithread.name = Parcaciklar setting.fps.name = FPS'i goster setting.vsync.name = VSync setting.lasers.name = Guc lazerlerini goster @@ -404,8 +404,6 @@ mode.waves.name = Dalgali mode.waves.description = Klasik mod. Dalgalara karsi cekirdegi koru. mode.sandbox.name = Serbest mode.sandbox.description = Sonsuz esyalar ve Dalga suresi yok -mode.custom.warning = Note that blocks cannot be used in custom games until they are unlocked in sectors.\n\n[LIGHT_GRAY]If you have not unlocked any blocks, none will appear. -mode.custom.warning.read = Just to make sure you've read it:\n[scarlet]UNLOCKS IN CUSTOM GAMES DO NOT CARRY OVER TO SECTORS OR OTHER MODES!\n\n[LIGHT_GRAY](I wish this wasn't necessary, but apparently it is) mode.freebuild.name = Yapi Yapma mode.freebuild.description = Sinirli esyalar ama dalga suresi yok. mode.pvp.name = PvP diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index f48c389c47..ee943e51a8 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -286,6 +286,7 @@ text.no = No text.info.title = [Vurgu] Bilgi text.error.title = [crimson] Bir hata oluştu text.error.crashtitle = Bir hata oluştu +text.blocks.unknown = [LIGHT_GRAY]??? text.blocks.blockinfo = Blok Bilgisi text.blocks.powercapacity = Güç kapasitesi text.blocks.powershot = Güç / atış @@ -359,7 +360,6 @@ setting.sensitivity.name = Denetleyici hassasiyeti setting.saveinterval.name = Otomatik Kaydetme Aralığı setting.seconds = saniye setting.fullscreen.name = Tam ekran -setting.multithread.name = Çok iş parçacığı setting.fps.name = Saniyede ... Kare göstermek setting.vsync.name = VSync setting.lasers.name = Güç Lazerleri Göster @@ -404,8 +404,6 @@ mode.waves.name = dalgalar mode.waves.description = normal mod. sınırlı kaynaklar ve otomatik gelen dalgalar. mode.sandbox.name = Limitsiz Oynama mode.sandbox.description = sonsuz kaynaklar ve dalgalar için zamanlayıcı yok. -mode.custom.warning = Note that blocks cannot be used in custom games until they are unlocked in sectors.\n\n[LIGHT_GRAY]If you have not unlocked any blocks, none will appear. -mode.custom.warning.read = Just to make sure you've read it:\n[scarlet]UNLOCKS IN CUSTOM GAMES DO NOT CARRY OVER TO SECTORS OR OTHER MODES!\n\n[LIGHT_GRAY](I wish this wasn't necessary, but apparently it is) mode.freebuild.name = Özgür Oynama mode.freebuild.description = sınırlı kaynaklar ve dalgalar için zamanlayıcı yok. mode.pvp.name = PvP diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index 71b077368b..bca4bcfa58 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -286,6 +286,7 @@ text.no = Ні text.info.title = [accent]Інформація text.error.title = [crimson]Виникла помилка text.error.crashtitle = Виникла помилка +text.blocks.unknown = [LIGHT_GRAY]??? text.blocks.blockinfo = Інформація про блок text.blocks.powercapacity = Місткість енергії text.blocks.powershot = Енергія/постріл @@ -359,7 +360,6 @@ setting.sensitivity.name = Чутливість контролера setting.saveinterval.name = Інтервал автозбереження setting.seconds = {0} сек. setting.fullscreen.name = Повноекранний режим -setting.multithread.name = Багатопотоковість (TPS) setting.fps.name = Показати FPS setting.vsync.name = Вертикальна синхронізація setting.lasers.name = Показати енергетичні лазери @@ -404,8 +404,6 @@ mode.waves.name = Хвилі mode.waves.description = Нормальний режим. Обмежені ресурси та автоматичні хвилі. mode.sandbox.name = Пісочниця mode.sandbox.description = Нескінченні ресурси і нема таймера для хвиль. -mode.custom.warning = [scarlet]РОЗБЛОКОВАНЕ В КОРИСТУВАЛЬНИЦЬКИХ ІГРАХ АБО НА СЕРВЕРАХ НЕ ЗБЕРІГАЄТЬСЯ.\n\nГрайте у секторах для розблокування. -mode.custom.warning.read = Уважно прочитайте це!:\n[scarlet]РОЗБЛОКОВАНЕ В КОРИСТУВАЛЬНИЦЬКИХ ІГРАХ АБО В ІНШИХ РЕЖИМАХ ГРИ НЕ ПОШИРЮЄТЬСЯ НА СЕКТОРИ ТА ІНШІ РЕЖИМИ ГРИ!\n\n[LIGHT_GRAY](Я б хотів, щоб це не було необхідно, але, мабуть, це так) mode.freebuild.name = Вільний режим mode.freebuild.description = обмежені ресурси і немає таймера для хвиль. mode.pvp.name = PvP diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index a024f004fc..90313f463f 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -286,6 +286,7 @@ text.no = 不 text.info.title = [accent]详情 text.error.title = [crimson]发生了一个错误 text.error.crashtitle = 发生了一个错误 +text.blocks.unknown = [LIGHT_GRAY]??? text.blocks.blockinfo = 方块详情 text.blocks.powercapacity = 能量容量 text.blocks.powershot = 能量/发射 @@ -359,7 +360,6 @@ setting.sensitivity.name = 控制器灵敏度 setting.saveinterval.name = 自动保存间隔 setting.seconds = {0} 秒 setting.fullscreen.name = 全屏 -setting.multithread.name = 多线程 setting.fps.name = 显示 FPS setting.vsync.name = 帧同步 setting.lasers.name = 显示能量射线 @@ -404,8 +404,6 @@ mode.waves.name = 普通 mode.waves.description = 普通模式,有限的资源和自动生成敌人。 mode.sandbox.name = 沙盒 mode.sandbox.description = 无限的资源,不会自动生成敌人。 -mode.custom.warning = 请注意,方块在区域内解锁之前,不能用于自定义游戏。\n\n[LIGHT_GRAY]如果您没有解锁任何方块,则不会出现任何方块。 -mode.custom.warning.read = 确保你已经阅读过它:\n[scarlet]自定义游戏的解锁不带至区域或其他模式!\n\n[LIGHT_GRAY](我希望这不是必要的,但显然是必要的) mode.freebuild.name = 自由建造 mode.freebuild.description = 有限的资源,不会自动生成敌人。 mode.pvp.name = PvP diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index 16a87728f9..e98bba92a5 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -286,6 +286,7 @@ text.no = 否 text.info.title = [accent]資訊 text.error.title = [crimson]發生錯誤 text.error.crashtitle = 發生錯誤 +text.blocks.unknown = [LIGHT_GRAY]??? text.blocks.blockinfo = 方塊資訊 text.blocks.powercapacity = 蓄電量 text.blocks.powershot = 能源/射擊 @@ -359,7 +360,6 @@ setting.sensitivity.name = 控制器靈敏度 setting.saveinterval.name = 自動存檔間隔 setting.seconds = {0}秒 setting.fullscreen.name = 全螢幕 -setting.multithread.name = 多執行緒 setting.fps.name = 顯示螢幕刷新率 setting.vsync.name = 垂直同步 setting.lasers.name = 顯示雷射光束 @@ -404,8 +404,6 @@ mode.waves.name = 一般 mode.waves.description = 一般模式,有限的資源與自動來襲的波次。 mode.sandbox.name = 沙盒 mode.sandbox.description = 無限的資源,與不倒數計時的波次。 -mode.custom.warning = 請注意,方塊在區域內解鎖之前,不能用於自訂遊戲。\n\n[LIGHT_GRAY]如果您沒有解鎖任何方塊,則不會出現任何方塊。 -mode.custom.warning.read = 確保你已閱讀過它:\n[scarlet]自訂遊戲的解鎖不帶至區域或其他模式!\n\n[LIGHT_GRAY](我希望這不是必要的,但顯然是必要的) mode.freebuild.name = 自由建造 mode.freebuild.description = 有限的資源,與不倒數計時的波次。 mode.pvp.name = 對戰 diff --git a/core/src/io/anuke/mindustry/game/Version.java b/core/src/io/anuke/mindustry/game/Version.java index e0d6ff304e..acc63bcc20 100644 --- a/core/src/io/anuke/mindustry/game/Version.java +++ b/core/src/io/anuke/mindustry/game/Version.java @@ -11,10 +11,10 @@ import java.io.IOException; public class Version{ /**Build type. 'official' for official releases; 'custom' or 'bleeding edge' are also used.*/ public static String type; - /**Number specifying the major version, e.g. '4.0'*/ - public static String number; /**Build modifier, e.g. 'alpha' or 'release'*/ public static String modifier; + /**Number specifying the major version, e.g. '4'*/ + public static int number; /**Build number, e.g. '43'. set to '-1' for custom builds.*/ public static int build = 0; @@ -26,7 +26,7 @@ public class Version{ PropertiesUtils.load(map, file.reader()); type = map.get("type"); - number = map.get("number"); + number = Integer.parseInt(map.get("number")); modifier = map.get("modifier"); build = Strings.canParseInt(map.get("build")) ? Integer.parseInt(map.get("build")) : -1; }catch(IOException e){ diff --git a/core/src/io/anuke/mindustry/net/Packets.java b/core/src/io/anuke/mindustry/net/Packets.java index 037d343a62..1d3ef834e7 100644 --- a/core/src/io/anuke/mindustry/net/Packets.java +++ b/core/src/io/anuke/mindustry/net/Packets.java @@ -2,7 +2,7 @@ package io.anuke.mindustry.net; import com.badlogic.gdx.utils.Base64Coder; import io.anuke.mindustry.game.Version; -import io.anuke.ucore.io.IOUtils; +import io.anuke.mindustry.io.TypeIO; import io.anuke.ucore.util.Bundles; import java.nio.ByteBuffer; @@ -65,6 +65,7 @@ public class Packets{ public static class ConnectPacket implements Packet{ public int version; + public String versionType; public String name, uuid, usid; public boolean mobile; public int color; @@ -72,8 +73,9 @@ public class Packets{ @Override public void write(ByteBuffer buffer){ buffer.putInt(Version.build); - IOUtils.writeString(buffer, name); - IOUtils.writeString(buffer, usid); + TypeIO.writeString(buffer, versionType); + TypeIO.writeString(buffer, name); + TypeIO.writeString(buffer, usid); buffer.put(mobile ? (byte) 1 : 0); buffer.putInt(color); buffer.put(Base64Coder.decode(uuid)); @@ -82,8 +84,9 @@ public class Packets{ @Override public void read(ByteBuffer buffer){ version = buffer.getInt(); - name = IOUtils.readString(buffer); - usid = IOUtils.readString(buffer); + versionType = TypeIO.readString(buffer); + name = TypeIO.readString(buffer); + usid = TypeIO.readString(buffer); mobile = buffer.get() == 1; color = buffer.getInt(); byte[] idbytes = new byte[8]; diff --git a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java index b26b728ae0..b50ff4d6db 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java @@ -11,6 +11,7 @@ import io.anuke.mindustry.ui.dialogs.FloatingDialog; import io.anuke.ucore.core.Events; import io.anuke.ucore.scene.Group; import io.anuke.ucore.scene.ui.layout.Table; +import io.anuke.ucore.util.Strings; import static io.anuke.mindustry.Vars.*; @@ -42,7 +43,7 @@ public class MenuFragment extends Fragment{ } //version info - parent.fill(c -> c.bottom().left().add("Mindustry " + Version.number + "-" + Version.modifier + " " + Version.type + " / " + (Version.build == -1 ? "custom build" : "build " + Version.build)) + parent.fill(c -> c.bottom().left().add(Strings.formatArgs("Mindustry v{0} {1}-{2} {3}", Version.number, Version.modifier, Version.type, (Version.build == -1 ? "custom build" : "build " + Version.build))) .visible(() -> state.is(State.menu))); } @@ -55,14 +56,14 @@ public class MenuFragment extends Fragment{ container.defaults().size(size).pad(5).padTop(4f); MobileButton - play = new MobileButton("icon-play-2", isize, "$text.play", this::showPlaySelect), - maps = new MobileButton("icon-map", isize, "$text.maps", ui.maps::show), - load = new MobileButton("icon-load", isize, "$text.load", ui.load::show), - join = new MobileButton("icon-add", isize, "$text.joingame", ui.join::show), - editor = new MobileButton("icon-editor", isize, "$text.editor", () -> ui.loadGraphics(ui.editor::show)), - tools = new MobileButton("icon-tools", isize, "$text.settings", ui.settings::show), - unlocks = new MobileButton("icon-unlocks", isize, "$text.unlocks", ui.unlocks::show), - donate = new MobileButton("icon-donate", isize, "$text.donate", Platform.instance::openDonations); + play = new MobileButton("icon-play-2", isize, "$text.play", this::showPlaySelect), + maps = new MobileButton("icon-map", isize, "$text.maps", ui.maps::show), + load = new MobileButton("icon-load", isize, "$text.load", ui.load::show), + join = new MobileButton("icon-add", isize, "$text.joingame", ui.join::show), + editor = new MobileButton("icon-editor", isize, "$text.editor", () -> ui.loadGraphics(ui.editor::show)), + tools = new MobileButton("icon-tools", isize, "$text.settings", ui.settings::show), + unlocks = new MobileButton("icon-unlocks", isize, "$text.unlocks", ui.unlocks::show), + donate = new MobileButton("icon-donate", isize, "$text.donate", Platform.instance::openDonations); if(Gdx.graphics.getWidth() > Gdx.graphics.getHeight()){ container.add(play); diff --git a/ios/build.gradle b/ios/build.gradle index b14d976190..d0bfc1752f 100644 --- a/ios/build.gradle +++ b/ios/build.gradle @@ -14,9 +14,4 @@ createIPA.dependsOn build robovm { archs = "thumbv7:arm64" -} - -eclipse.project { - name = appName + "-ios" - natures 'org.robovm.eclipse.RoboVMNature' } \ No newline at end of file diff --git a/ios/robovm.properties b/ios/robovm.properties deleted file mode 100644 index 3bc8a2f6b5..0000000000 --- a/ios/robovm.properties +++ /dev/null @@ -1,7 +0,0 @@ -#Tue Nov 20 20:02:17 EST 2018 -app.version=4.0 -app.id=io.anuke.mindustry -app.mainclass=io.anuke.mindustry.IOSLauncher -app.executable=IOSLauncher -app.build=32 -app.name=Mindustry From 2842018c2f449c15f2fdb87bf24f7ed57e7665c2 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 21 Nov 2018 11:01:16 -0500 Subject: [PATCH 04/32] Ignored robovm.properties --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index cfa73a21a5..20247e61be 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,7 @@ logs/ /core/assets/locales /ios/src/io/anuke/mindustry/gen/ /core/src/io/anuke/mindustry/gen/ +ios/robovm.properties *.gif version.properties From d498ac89f208b20487a95bbe56fcbae3a5b292f4 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 21 Nov 2018 21:13:30 -0500 Subject: [PATCH 05/32] Mining bugfix --- core/src/io/anuke/mindustry/entities/Player.java | 10 ++++++---- .../anuke/mindustry/entities/traits/BuilderTrait.java | 6 +++++- .../io/anuke/mindustry/entities/units/types/Drone.java | 5 +++++ 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/core/src/io/anuke/mindustry/entities/Player.java b/core/src/io/anuke/mindustry/entities/Player.java index 376a8591de..a83bfcc18f 100644 --- a/core/src/io/anuke/mindustry/entities/Player.java +++ b/core/src/io/anuke/mindustry/entities/Player.java @@ -19,10 +19,7 @@ import io.anuke.mindustry.graphics.Trail; import io.anuke.mindustry.io.TypeIO; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.NetConnection; -import io.anuke.mindustry.type.ContentType; -import io.anuke.mindustry.type.ItemStack; -import io.anuke.mindustry.type.Mech; -import io.anuke.mindustry.type.Weapon; +import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.Floor; @@ -192,6 +189,11 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra this.mining = tile; } + @Override + public boolean canMine(Item item){ + return item.hardness <= mech.drillPower; + } + @Override public float getArmor(){ return mech.armor + mech.getExtraArmor(this); diff --git a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java index af79babcc1..7b25c12348 100644 --- a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java +++ b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java @@ -58,6 +58,9 @@ public interface BuilderTrait extends Entity{ /**Build power, can be any float. 1 = builds recipes in normal time, 0 = doesn't build at all.*/ float getBuildPower(Tile tile); + /**Returns whether or not this builder can mine a specific item type.*/ + boolean canMine(Item item); + /**Whether this type of builder can begin creating new blocks.*/ default boolean canCreateBlocks(){ return true; @@ -236,7 +239,8 @@ public interface BuilderTrait extends Entity{ Tile tile = getMineTile(); TileEntity core = unit.getClosestCore(); - if(core == null || tile.block() != Blocks.air || unit.distanceTo(tile.worldx(), tile.worldy()) > mineDistance || tile.floor().drops == null || !unit.inventory.canAcceptItem(tile.floor().drops.item)){ + if(core == null || tile.block() != Blocks.air || unit.distanceTo(tile.worldx(), tile.worldy()) > mineDistance + || tile.floor().drops == null || !unit.inventory.canAcceptItem(tile.floor().drops.item) || !canMine(tile.floor().drops.item)){ setMineTile(null); }else{ Item item = tile.floor().drops.item; 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 35c254ce2a..4b9ebe820d 100644 --- a/core/src/io/anuke/mindustry/entities/units/types/Drone.java +++ b/core/src/io/anuke/mindustry/entities/units/types/Drone.java @@ -279,6 +279,11 @@ public class Drone extends FlyingUnit implements BuilderTrait{ //no } + @Override + public boolean canMine(Item item){ + return type.toMine.contains(item); + } + @Override public float getBuildPower(Tile tile){ return type.buildPower; From 7795a690ed28317a60596ba2c7251cc4ddea57f6 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 21 Nov 2018 21:17:45 -0500 Subject: [PATCH 06/32] Fixed fillitems command --- server/src/io/anuke/mindustry/server/ServerControl.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/server/src/io/anuke/mindustry/server/ServerControl.java b/server/src/io/anuke/mindustry/server/ServerControl.java index e4be13ed40..22c1ab47f1 100644 --- a/server/src/io/anuke/mindustry/server/ServerControl.java +++ b/server/src/io/anuke/mindustry/server/ServerControl.java @@ -350,14 +350,19 @@ public class ServerControl extends Module{ } }); - handler.register("fillitems", "Fill the core with 2000 items.", arg -> { + handler.register("fillitems", "[team]", "Fill the core with 2000 items.", arg -> { if(!state.is(State.playing)){ err("Not playing. Host first."); return; } try{ - Team team = Team.valueOf(arg[0]); + Team team = arg.length == 0 ? Team.blue : Team.valueOf(arg[0]); + + if(state.teams.get(team).cores.isEmpty()){ + err("That team has no cores."); + return; + } for(Item item : content.items()){ if(item.type == ItemType.material){ From 1bc1f666131bd907dda17a4251f714f62258c1d1 Mon Sep 17 00:00:00 2001 From: VizardAlpha <43859764+VizardAlpha@users.noreply.github.com> Date: Thu, 22 Nov 2018 04:02:28 +0100 Subject: [PATCH 07/32] Updates bundle_fr_BE.properties (#351) I had not seen the last line to translate. --- core/assets/bundles/bundle_fr_BE.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/assets/bundles/bundle_fr_BE.properties b/core/assets/bundles/bundle_fr_BE.properties index b653051de2..851ace289e 100644 --- a/core/assets/bundles/bundle_fr_BE.properties +++ b/core/assets/bundles/bundle_fr_BE.properties @@ -368,7 +368,7 @@ setting.musicvol.name = Volume de la musique setting.mutemusic.name = Couper la musique setting.sfxvol.name = Volume des SFX setting.mutesound.name = Couper les SFX -setting.crashreport.name = Send Anonymous Crash Reports +setting.crashreport.name = Envoyer des rapports d'incident anonymement. text.keybind.title = Paramétrer les touches category.general.name = Général category.view.name = Voir From 9266b55ddfb7280134a3f381fcd9cdd066a7f699 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 21 Nov 2018 23:05:33 -0500 Subject: [PATCH 08/32] Fixed charset issues --- core/src/io/anuke/mindustry/io/TypeIO.java | 27 ++++------------------ 1 file changed, 4 insertions(+), 23 deletions(-) diff --git a/core/src/io/anuke/mindustry/io/TypeIO.java b/core/src/io/anuke/mindustry/io/TypeIO.java index 6061472054..a8829cb90a 100644 --- a/core/src/io/anuke/mindustry/io/TypeIO.java +++ b/core/src/io/anuke/mindustry/io/TypeIO.java @@ -27,7 +27,6 @@ import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import java.nio.ByteBuffer; -import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import static io.anuke.mindustry.Vars.*; @@ -332,12 +331,7 @@ public class TypeIO{ @WriteClass(String.class) public static void writeString(ByteBuffer buffer, String string){ if(string != null){ - Charset charset = Charset.defaultCharset(); - byte[] nameBytes = charset.name().getBytes(StandardCharsets.UTF_8); - buffer.put((byte)nameBytes.length); - buffer.put(nameBytes); - - byte[] bytes = string.getBytes(charset); + byte[] bytes = string.getBytes(StandardCharsets.UTF_8); buffer.putShort((short) bytes.length); buffer.put(bytes); }else{ @@ -349,14 +343,10 @@ public class TypeIO{ public static String readString(ByteBuffer buffer){ byte length = buffer.get(); if(length != -1){ - byte[] cbytes = new byte[length]; - buffer.get(cbytes); - Charset charset = Charset.forName(new String(cbytes, StandardCharsets.UTF_8)); - short slength = buffer.getShort(); byte[] bytes = new byte[slength]; buffer.get(bytes); - return new String(bytes, charset); + return new String(bytes, StandardCharsets.UTF_8); }else{ return null; } @@ -378,12 +368,7 @@ public class TypeIO{ public static void writeStringData(DataOutput buffer, String string) throws IOException{ if(string != null){ - Charset charset = Charset.defaultCharset(); - byte[] nameBytes = charset.name().getBytes(StandardCharsets.UTF_8); - buffer.writeByte((byte)nameBytes.length); - buffer.write(nameBytes); - - byte[] bytes = string.getBytes(charset); + byte[] bytes = string.getBytes(StandardCharsets.UTF_8); buffer.writeShort((short) bytes.length); buffer.write(bytes); }else{ @@ -394,14 +379,10 @@ public class TypeIO{ public static String readStringData(DataInput buffer) throws IOException{ byte length = buffer.readByte(); if(length != -1){ - byte[] cbytes = new byte[length]; - buffer.readFully(cbytes); - Charset charset = Charset.forName(new String(cbytes, StandardCharsets.UTF_8)); - short slength = buffer.readShort(); byte[] bytes = new byte[slength]; buffer.readFully(bytes); - return new String(bytes, charset); + return new String(bytes, StandardCharsets.UTF_8); }else{ return null; } From c5241eaaf657ed4bf73ce23a63d91772681bd284 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 21 Nov 2018 23:12:27 -0500 Subject: [PATCH 09/32] Encoding tests --- core/src/io/anuke/mindustry/io/TypeIO.java | 14 ++++----- tests/src/test/java/IOTests.java | 34 ++++++++++++++++++++++ 2 files changed, 40 insertions(+), 8 deletions(-) create mode 100644 tests/src/test/java/IOTests.java diff --git a/core/src/io/anuke/mindustry/io/TypeIO.java b/core/src/io/anuke/mindustry/io/TypeIO.java index a8829cb90a..94b3f0825f 100644 --- a/core/src/io/anuke/mindustry/io/TypeIO.java +++ b/core/src/io/anuke/mindustry/io/TypeIO.java @@ -335,15 +335,14 @@ public class TypeIO{ buffer.putShort((short) bytes.length); buffer.put(bytes); }else{ - buffer.put((byte) -1); + buffer.putShort((short) -1); } } @ReadClass(String.class) public static String readString(ByteBuffer buffer){ - byte length = buffer.get(); - if(length != -1){ - short slength = buffer.getShort(); + short slength = buffer.getShort(); + if(slength != -1){ byte[] bytes = new byte[slength]; buffer.get(bytes); return new String(bytes, StandardCharsets.UTF_8); @@ -372,14 +371,13 @@ public class TypeIO{ buffer.writeShort((short) bytes.length); buffer.write(bytes); }else{ - buffer.writeByte((byte) -1); + buffer.writeShort((short) -1); } } public static String readStringData(DataInput buffer) throws IOException{ - byte length = buffer.readByte(); - if(length != -1){ - short slength = buffer.readShort(); + short slength = buffer.readShort(); + if(slength != -1){ byte[] bytes = new byte[slength]; buffer.readFully(bytes); return new String(bytes, StandardCharsets.UTF_8); diff --git a/tests/src/test/java/IOTests.java b/tests/src/test/java/IOTests.java new file mode 100644 index 0000000000..5357bb515e --- /dev/null +++ b/tests/src/test/java/IOTests.java @@ -0,0 +1,34 @@ +import io.anuke.mindustry.io.TypeIO; +import org.junit.jupiter.api.Test; + +import java.nio.ByteBuffer; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class IOTests{ + + @Test + void writeEnglish(){ + ByteBuffer buffer = ByteBuffer.allocate(500); + TypeIO.writeString(buffer, "asd asd asd asd asdagagasasjakbgeah;jwrej 23424234"); + buffer.position(0); + assertEquals(TypeIO.readString(buffer), "asd asd asd asd asdagagasasjakbgeah;jwrej 23424234"); + } + + @Test + void writeChinese(){ + ByteBuffer buffer = ByteBuffer.allocate(500); + TypeIO.writeString(buffer, "这个服务器可以用自己的语言说话"); + buffer.position(0); + assertEquals(TypeIO.readString(buffer), "这个服务器可以用自己的语言说话"); + } + + @Test + void writeNull(){ + ByteBuffer buffer = ByteBuffer.allocate(500); + TypeIO.writeString(buffer, null); + buffer.position(0); + assertEquals(TypeIO.readString(buffer), null); + } + +} From 5447c71790f1ed6c827ec35eef6fde8cdbeebf57 Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 22 Nov 2018 08:39:05 -0500 Subject: [PATCH 10/32] Removed junction item voiding --- .../mindustry/graphics/BlockRenderer.java | 2 +- .../world/blocks/distribution/Junction.java | 73 ++++--------------- 2 files changed, 14 insertions(+), 61 deletions(-) diff --git a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java index 2b34127e2a..5b679ccdf4 100644 --- a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java @@ -21,7 +21,7 @@ import static io.anuke.ucore.core.Core.camera; public class BlockRenderer{ private final static int initialRequests = 32 * 32; - private final static int expandr = 4; + private final static int expandr = 6; private FloorRenderer floorRenderer; diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Junction.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Junction.java index 9027fb632c..88359454cc 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Junction.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Junction.java @@ -1,6 +1,5 @@ package io.anuke.mindustry.world.blocks.distribution; -import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.NumberUtils; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.type.Item; @@ -8,10 +7,9 @@ import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.meta.BlockGroup; import io.anuke.ucore.core.Timers; -import io.anuke.ucore.function.Consumer; import io.anuke.ucore.util.Bits; -import static io.anuke.mindustry.Vars.*; +import static io.anuke.mindustry.Vars.content; public class Junction extends Block{ protected float speed = 26; //frames taken to go through this junction @@ -34,8 +32,8 @@ public class Junction extends Block{ public void update(Tile tile){ JunctionEntity entity = tile.entity(); - for(int i = 0; i < 2; i++){ - Buffer buffer = (i == 0 ? entity.bx : entity.by); + for(int i = 0; i < 4; i++){ + Buffer buffer = entity.buffers[i]; if(buffer.index > 0){ if(buffer.index > buffer.items.length) buffer.index = buffer.items.length; @@ -44,17 +42,11 @@ public class Junction extends Block{ if(Timers.time() >= time + speed || Timers.time() < time){ - int val = Bits.getRightInt(l); - - Item item = content.item(Bits.getLeftShort(val)); - int direction = Bits.getRightShort(val); - Tile dest = tile.getNearby(direction); + Item item = content.item(Bits.getRightInt(l)); + Tile dest = tile.getNearby(i); + //skip blocks that don't want the item, keep waiting until they do if(dest == null || !dest.block().acceptItem(item, dest, tile)){ - if(buffer.index > 1 && Bits.getRightShort(Bits.getRightInt(buffer.items[1])) != direction){ - System.arraycopy(buffer.items, 1, buffer.items, 0, buffer.index - 1); - buffer.index--; - } continue; } @@ -69,25 +61,19 @@ public class Junction extends Block{ @Override public void handleItem(Item item, Tile tile, Tile source){ JunctionEntity entity = tile.entity(); - boolean x = tile.x == source.x; - long value = Bits.packLong(NumberUtils.floatToIntBits(Timers.time()), Bits.packInt((short) item.id, source.relativeTo(tile.x, tile.y))); - if(x){ - entity.bx.add(value); - }else{ - entity.by.add(value); - } + long value = Bits.packLong(NumberUtils.floatToIntBits(Timers.time()), item.id); + int relative = source.relativeTo(tile.x, tile.y); + entity.buffers[relative].add(value); } @Override public boolean acceptItem(Item item, Tile tile, Tile source){ JunctionEntity entity = tile.entity(); - boolean x = tile.x == source.x; + int relative = source.relativeTo(tile.x, tile.y); - if(entity == null || entity.bx == null || entity.by == null || (x && entity.bx.full()) || (!x && entity.by.full())) + if(entity == null || relative == -1 || entity.buffers[relative].full()) return false; - int dir = source.relativeTo(tile.x, tile.y); - if(dir == -1) return false; - Tile to = tile.getNearby(dir); + Tile to = tile.getNearby(relative); return to != null && to.block().acceptItem(item, to, tile); } @@ -96,41 +82,8 @@ public class Junction extends Block{ return new JunctionEntity(); } - @Override - public Array getDebugInfo(Tile tile){ - JunctionEntity entity = tile.entity(); - Array arr = super.getDebugInfo(tile); - for(int i = 0; i < 4; i++){ - arr.add("nearby." + i); - arr.add(tile.getNearby(i)); - } - - Consumer write = b -> { - for(int i = 0; i < b.index; i++){ - long l = b.items[i]; - float time = NumberUtils.intBitsToFloat(Bits.getLeftInt(l)); - int val = Bits.getRightInt(l); - Item item = content.item(Bits.getLeftShort(val)); - int direction = Bits.getRightShort(val); - Tile dest = tile.getNearby(direction); - arr.add(" bufferx.item"); - arr.add(time + " | " + item.name + " | " + dest.block() + ":" + dest.floor()); - } - }; - - arr.add("buffer.bx"); - arr.add(entity.bx.index); - write.accept(entity.bx); - arr.add("buffer.by"); - arr.add(entity.bx.index); - write.accept(entity.by); - - return arr; - } - class JunctionEntity extends TileEntity{ - Buffer bx = new Buffer(); - Buffer by = new Buffer(); + Buffer[] buffers = {new Buffer(), new Buffer(), new Buffer(), new Buffer()}; } class Buffer{ From f5959c88298686dff56601762e110109f6dd2a36 Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 22 Nov 2018 19:09:51 -0500 Subject: [PATCH 11/32] Optional display section --- core/assets/bundles/bundle.properties | 4 ++- .../anuke/mindustry/world/blocks/Floor.java | 2 +- .../blocks/power/ItemLiquidGenerator.java | 2 -- .../world/blocks/power/TurbineGenerator.java | 1 - .../mindustry/world/consumers/Consume.java | 4 +-- .../world/consumers/ConsumeItem.java | 2 +- .../world/consumers/ConsumeItemFilter.java | 2 +- .../world/consumers/ConsumeItems.java | 2 +- .../world/consumers/ConsumeLiquid.java | 8 +++-- .../world/consumers/ConsumeLiquidFilter.java | 6 ++-- .../anuke/mindustry/world/meta/BlockStat.java | 4 ++- .../mindustry/world/meta/BlockStats.java | 34 +++++-------------- .../mindustry/world/meta/StatCategory.java | 7 ++-- 13 files changed, 34 insertions(+), 44 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index b1604578b9..d89b093948 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -321,7 +321,8 @@ text.blocks.coolant = Coolant text.blocks.coolantuse = Coolant Use text.blocks.inputliquidfuel = Fuel Liquid text.blocks.liquidfueluse = Liquid Fuel Use -text.blocks.explosive = Highly explosive\! +text.blocks.boostitem = Boost Item +text.blocks.boostliquid = Boost Liquid text.blocks.health = Health text.blocks.inaccuracy = Inaccuracy text.blocks.shots = Shots @@ -346,6 +347,7 @@ text.category.liquids = Liquids text.category.items = Items text.category.crafting = Crafting text.category.shooting = Shooting +text.category.optional = Optional Enhancements setting.autotarget.name = Auto-Target setting.fpscap.name = Max FPS setting.fpscap.none = None diff --git a/core/src/io/anuke/mindustry/world/blocks/Floor.java b/core/src/io/anuke/mindustry/world/blocks/Floor.java index fd4d581f2d..8c27abc074 100644 --- a/core/src/io/anuke/mindustry/world/blocks/Floor.java +++ b/core/src/io/anuke/mindustry/world/blocks/Floor.java @@ -181,7 +181,7 @@ public class Floor extends Block{ Floor floor = other.floor(); - if((floor.id <= this.id && !(tile.getElevation() != -1 && other.getElevation() > tile.getElevation())) || (!blends.test(floor) && !tileBlends.test(tile, other)) || (floor.cacheLayer.ordinal() > this.cacheLayer.ordinal() && !sameLayer) || + if(floor.edgeRegions == null || (floor.id <= this.id && !(tile.getElevation() != -1 && other.getElevation() > tile.getElevation())) || (!blends.test(floor) && !tileBlends.test(tile, other)) || (floor.cacheLayer.ordinal() > this.cacheLayer.ordinal() && !sameLayer) || (sameLayer && floor.cacheLayer == this.cacheLayer)) continue; TextureRegion region = floor.edgeRegions[i]; diff --git a/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java index fa1a44c5cf..9aac369832 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java @@ -5,7 +5,6 @@ import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.consumers.ConsumeLiquidFilter; -import io.anuke.mindustry.world.meta.BlockStat; import io.anuke.ucore.core.Effects; import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.util.Mathf; @@ -30,7 +29,6 @@ public abstract class ItemLiquidGenerator extends ItemGenerator{ @Override public void init(){ super.init(); - stats.remove(BlockStat.liquidFuelUse); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/power/TurbineGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/TurbineGenerator.java index 7416986d6e..05f8daad7d 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/TurbineGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/TurbineGenerator.java @@ -4,7 +4,6 @@ import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.consumers.ConsumeLiquid; -//TODO public class TurbineGenerator extends BurnerGenerator{ public TurbineGenerator(String name){ diff --git a/core/src/io/anuke/mindustry/world/consumers/Consume.java b/core/src/io/anuke/mindustry/world/consumers/Consume.java index 8408389933..f4ec4cb01f 100644 --- a/core/src/io/anuke/mindustry/world/consumers/Consume.java +++ b/core/src/io/anuke/mindustry/world/consumers/Consume.java @@ -11,8 +11,8 @@ import io.anuke.ucore.scene.ui.layout.Table; import static io.anuke.mindustry.Vars.mobile; public abstract class Consume{ - private boolean optional; - private boolean update = true; + protected boolean optional; + protected boolean update = true; public Consume optional(boolean optional){ this.optional = optional; diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeItem.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeItem.java index 863cbc8dc7..9476e43eff 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeItem.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeItem.java @@ -53,6 +53,6 @@ public class ConsumeItem extends Consume{ @Override public void display(BlockStats stats){ - stats.add(BlockStat.inputItem, item); + stats.add(optional ? BlockStat.boostItem : BlockStat.inputItem, item); } } diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java index 69e1077db1..c7c24114a4 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java @@ -58,6 +58,6 @@ public class ConsumeItemFilter extends Consume{ @Override public void display(BlockStats stats){ - stats.add(BlockStat.inputItems, new ItemFilterValue(filter)); + stats.add(optional ? BlockStat.boostItem : BlockStat.inputItem, new ItemFilterValue(filter)); } } diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeItems.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeItems.java index f5a2a8e4b0..b46c984c2d 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeItems.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeItems.java @@ -44,6 +44,6 @@ public class ConsumeItems extends Consume{ @Override public void display(BlockStats stats){ - stats.add(BlockStat.inputItems, new ItemListValue(items)); + stats.add(optional ? BlockStat.boostItem : BlockStat.inputItems, new ItemListValue(items)); } } diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java index 0934cf73e5..eacbdb2de8 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java @@ -47,8 +47,12 @@ public class ConsumeLiquid extends Consume{ @Override public void display(BlockStats stats){ - stats.add(BlockStat.liquidUse, use * 60f, StatUnit.liquidSecond); - stats.add(BlockStat.inputLiquid, liquid); + if(!optional){ + stats.add(BlockStat.liquidUse, use * 60f, StatUnit.liquidSecond); + stats.add(BlockStat.inputLiquid, liquid); + }else{ + stats.add(BlockStat.boostLiquid, liquid); + } } float use(Block block, TileEntity entity){ diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java index 19a5395522..80be0c49aa 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java @@ -62,10 +62,12 @@ public class ConsumeLiquidFilter extends Consume{ @Override public void display(BlockStats stats){ - if(isFuel){ + if(optional){ + stats.add(BlockStat.boostLiquid, new LiquidFilterValue(filter)); + }else if(isFuel){ stats.add(BlockStat.inputLiquidFuel, new LiquidFilterValue(filter)); stats.add(BlockStat.liquidFuelUse, 60f * use, StatUnit.liquidSecond); - }else{ + }else { stats.add(BlockStat.inputLiquid, new LiquidFilterValue(filter)); stats.add(BlockStat.liquidUse, 60f * use, StatUnit.liquidSecond); } diff --git a/core/src/io/anuke/mindustry/world/meta/BlockStat.java b/core/src/io/anuke/mindustry/world/meta/BlockStat.java index 5bfd481570..834e8f3ce2 100644 --- a/core/src/io/anuke/mindustry/world/meta/BlockStat.java +++ b/core/src/io/anuke/mindustry/world/meta/BlockStat.java @@ -45,8 +45,10 @@ public enum BlockStat{ shots(StatCategory.shooting), reload(StatCategory.shooting), powerShot(StatCategory.shooting), - targetsAir(StatCategory.shooting),; + targetsAir(StatCategory.shooting), + boostItem(StatCategory.optional), + boostLiquid(StatCategory.optional),; public final StatCategory category; diff --git a/core/src/io/anuke/mindustry/world/meta/BlockStats.java b/core/src/io/anuke/mindustry/world/meta/BlockStats.java index 2e6b3507aa..105222cf7a 100644 --- a/core/src/io/anuke/mindustry/world/meta/BlockStats.java +++ b/core/src/io/anuke/mindustry/world/meta/BlockStats.java @@ -12,9 +12,7 @@ import io.anuke.ucore.util.Log; import java.util.Locale; -/** - * Hold and organizes a list of block stats. - */ +/**Hold and organizes a list of block stats.*/ public class BlockStats{ private static final boolean errorWhenMissing = false; @@ -26,52 +24,37 @@ public class BlockStats{ this.block = block; } - /** - * Adds a single float value with this stat, formatted to 2 decimal places. - */ + /**Adds a single float value with this stat, formatted to 2 decimal places.*/ public void add(BlockStat stat, float value, StatUnit unit){ add(stat, new NumberValue(value, unit)); } - /** - * Adds a single y/n boolean value. - */ + /**Adds a single y/n boolean value.*/ public void add(BlockStat stat, boolean value){ add(stat, new BooleanValue(value)); } - /** - * Adds an item value. - */ + /**Adds an item value.*/ public void add(BlockStat stat, Item item){ add(stat, new ItemValue(new ItemStack(item, 1))); } - /** - * Adds a liquid value. - */ + /**Adds a liquid value.*/ public void add(BlockStat stat, Liquid liquid){ add(stat, new LiquidValue(liquid)); } - - /** - * Adds an item value. - */ + /**Adds an item value.*/ public void add(BlockStat stat, ItemStack item){ add(stat, new ItemValue(item)); } - /** - * Adds a single string value with this stat. - */ + /**Adds a single string value with this stat.*/ public void add(BlockStat stat, String format, Object... args){ add(stat, new StringValue(format, args)); } - /** - * Adds a stat value. - */ + /**Adds a stat value.*/ public void add(BlockStat stat, StatValue value){ if(!Bundles.has("text.blocks." + stat.name().toLowerCase(Locale.ROOT))){ if(!errorWhenMissing){ @@ -102,6 +85,7 @@ public class BlockStats{ dirty = true; } + /**Removes a stat, if it exists.*/ public void remove(BlockStat stat){ if(!map.containsKey(stat.category) || !map.get(stat.category).containsKey(stat)){ throw new RuntimeException("No stat entry found: \"" + stat + "\" in block '" + block.name + "'!"); diff --git a/core/src/io/anuke/mindustry/world/meta/StatCategory.java b/core/src/io/anuke/mindustry/world/meta/StatCategory.java index ce1ef5b6f2..0080d5daf5 100644 --- a/core/src/io/anuke/mindustry/world/meta/StatCategory.java +++ b/core/src/io/anuke/mindustry/world/meta/StatCategory.java @@ -1,13 +1,12 @@ package io.anuke.mindustry.world.meta; -/** - * A specific category for a stat. - */ +/**A specific category for a stat.*/ public enum StatCategory{ general, power, liquids, items, crafting, - shooting + shooting, + optional, } From 24c72650fb15b089012150856a239edcb40e53a4 Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 22 Nov 2018 19:10:31 -0500 Subject: [PATCH 12/32] Bundles update --- core/assets/bundles/bundle_de.properties | 4 +++- core/assets/bundles/bundle_es.properties | 4 +++- core/assets/bundles/bundle_fr.properties | 4 +++- core/assets/bundles/bundle_fr_BE.properties | 4 +++- core/assets/bundles/bundle_in_ID.properties | 4 +++- core/assets/bundles/bundle_it.properties | 4 +++- core/assets/bundles/bundle_ja.properties | 4 +++- core/assets/bundles/bundle_ko.properties | 4 +++- core/assets/bundles/bundle_pl.properties | 4 +++- core/assets/bundles/bundle_pt_BR.properties | 4 +++- core/assets/bundles/bundle_ru.properties | 4 +++- core/assets/bundles/bundle_tk.properties | 4 +++- core/assets/bundles/bundle_tr.properties | 4 +++- core/assets/bundles/bundle_uk_UA.properties | 4 +++- core/assets/bundles/bundle_zh_CN.properties | 4 +++- core/assets/bundles/bundle_zh_TW.properties | 4 +++- 16 files changed, 48 insertions(+), 16 deletions(-) diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index b5a0972fba..d7840e685c 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -319,7 +319,8 @@ text.blocks.coolant = Kühlmittel text.blocks.coolantuse = Kühlmittelverbrauch text.blocks.inputliquidfuel = Kraftstoff text.blocks.liquidfueluse = Kraftstoffverbrauch -text.blocks.explosive = Hochexplosiv! +text.blocks.boostitem = Boost Item +text.blocks.boostliquid = Boost Liquid text.blocks.health = Lebenspunkte text.blocks.inaccuracy = Ungenauigkeit text.blocks.shots = Schüsse @@ -344,6 +345,7 @@ text.category.liquids = Flüssigkeiten text.category.items = Materialien text.category.crafting = Erzeugung text.category.shooting = Schießen +text.category.optional = Optional Enhancements setting.autotarget.name = Auto-Zielauswahl setting.fpscap.name = Max FPS setting.fpscap.none = kein diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index 7d9362b2cd..5d753f7732 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -319,7 +319,8 @@ text.blocks.coolant = Refrigerante text.blocks.coolantuse = Uso del Refrigerante text.blocks.inputliquidfuel = Combustible Líquido text.blocks.liquidfueluse = Uso del Combustible Líquido -text.blocks.explosive = ¡Altamente Explosivo! +text.blocks.boostitem = Boost Item +text.blocks.boostliquid = Boost Liquid text.blocks.health = Vida text.blocks.inaccuracy = Imprecisión text.blocks.shots = Disparos @@ -344,6 +345,7 @@ text.category.liquids = Líquidos text.category.items = Objetos text.category.crafting = Fabricación text.category.shooting = Disparo +text.category.optional = Optional Enhancements setting.autotarget.name = Auto apuntado setting.fpscap.name = Máx FPS setting.fpscap.none = Nada diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index a65e1aa21c..f8351c8f7b 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -319,7 +319,8 @@ text.blocks.coolant = Liquide de refroidissement text.blocks.coolantuse = Quantité de liquide de refroidissement utilisée text.blocks.inputliquidfuel = Carburant liquide text.blocks.liquidfueluse = Quantité de carburant liquide utilisé -text.blocks.explosive = Hautement explosif! +text.blocks.boostitem = Boost Item +text.blocks.boostliquid = Boost Liquid text.blocks.health = Santé text.blocks.inaccuracy = Précision text.blocks.shots = Tir @@ -344,6 +345,7 @@ text.category.liquids = Liquides text.category.items = Objets text.category.crafting = Fabrication text.category.shooting = Défense +text.category.optional = Optional Enhancements setting.autotarget.name = Visée automatique setting.fpscap.name = Max FPS setting.fpscap.none = None diff --git a/core/assets/bundles/bundle_fr_BE.properties b/core/assets/bundles/bundle_fr_BE.properties index 851ace289e..ed93ffbf39 100644 --- a/core/assets/bundles/bundle_fr_BE.properties +++ b/core/assets/bundles/bundle_fr_BE.properties @@ -319,7 +319,8 @@ text.blocks.coolant = Liquide de refroidissement text.blocks.coolantuse = Quantité de liquide de refroidissement utilisé text.blocks.inputliquidfuel = Carburant liquide text.blocks.liquidfueluse = Quantité de carburant liquide utilisé -text.blocks.explosive = Hautement explosif ! +text.blocks.boostitem = Boost Item +text.blocks.boostliquid = Boost Liquid text.blocks.health = Santé text.blocks.inaccuracy = Précision text.blocks.shots = Tirs @@ -344,6 +345,7 @@ text.category.liquids = Liquides text.category.items = Objets text.category.crafting = Fabrication text.category.shooting = Défense +text.category.optional = Optional Enhancements setting.autotarget.name = Visée automatique setting.fpscap.name = Max FPS setting.fpscap.none = Vide diff --git a/core/assets/bundles/bundle_in_ID.properties b/core/assets/bundles/bundle_in_ID.properties index 87704d767b..387e2f6bf3 100644 --- a/core/assets/bundles/bundle_in_ID.properties +++ b/core/assets/bundles/bundle_in_ID.properties @@ -319,7 +319,8 @@ text.blocks.coolant = Coolant text.blocks.coolantuse = Coolant Use text.blocks.inputliquidfuel = Fuel Liquid text.blocks.liquidfueluse = Liquid Fuel Use -text.blocks.explosive = Mudah meledak! +text.blocks.boostitem = Boost Item +text.blocks.boostliquid = Boost Liquid text.blocks.health = Darah text.blocks.inaccuracy = Ketidaktelitian text.blocks.shots = Tembakan @@ -344,6 +345,7 @@ text.category.liquids = Liquids text.category.items = Items text.category.crafting = Crafting text.category.shooting = Shooting +text.category.optional = Optional Enhancements setting.autotarget.name = Auto-Target setting.fpscap.name = Max FPS setting.fpscap.none = None diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index 2ed037b43d..514ff0569f 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -319,7 +319,8 @@ text.blocks.coolant = Refrigerante text.blocks.coolantuse = uso refrigerante text.blocks.inputliquidfuel = carburante liquido text.blocks.liquidfueluse = Utilizzo carburante liquido -text.blocks.explosive = Altamente esplosivo! +text.blocks.boostitem = Boost Item +text.blocks.boostliquid = Boost Liquid text.blocks.health = Salute text.blocks.inaccuracy = Inaccuratezza text.blocks.shots = Colpi @@ -344,6 +345,7 @@ text.category.liquids = Liquidi text.category.items = Oggetti text.category.crafting = Produzione text.category.shooting = Potenza di fuoco +text.category.optional = Optional Enhancements setting.autotarget.name = Auto-Target setting.fpscap.name = Limite FPS setting.fpscap.none = Niente diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index e2308591e7..3ab3a1ba2b 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -319,7 +319,8 @@ text.blocks.coolant = 冷却 text.blocks.coolantuse = 冷却使用量 text.blocks.inputliquidfuel = 液体燃料 text.blocks.liquidfueluse = 液体燃料使用量 -text.blocks.explosive = 高い爆発性! +text.blocks.boostitem = Boost Item +text.blocks.boostliquid = Boost Liquid text.blocks.health = 耐久値 text.blocks.inaccuracy = 不正確 text.blocks.shots = ショット @@ -344,6 +345,7 @@ text.category.liquids = 液体 text.category.items = アイテム text.category.crafting = 製作速度 text.category.shooting = 攻撃速度 +text.category.optional = Optional Enhancements setting.autotarget.name = 自動ターゲット setting.fpscap.name = 最大FPS setting.fpscap.none = なし diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index fd7bdcd8af..6b031d5de0 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -319,7 +319,8 @@ text.blocks.coolant = 냉각제 text.blocks.coolantuse = 냉각수 사용 text.blocks.inputliquidfuel = 연료 액 text.blocks.liquidfueluse = 액체 연료 사용 -text.blocks.explosive = 이 블록이 터지면 주변 블록과 같이 자폭을 합니다!! +text.blocks.boostitem = Boost Item +text.blocks.boostliquid = Boost Liquid text.blocks.health = 체력 text.blocks.inaccuracy = 오차각 text.blocks.shots = 발포 횟수 @@ -344,6 +345,7 @@ text.category.liquids = 액체 text.category.items = 아이템 text.category.crafting = 제작 text.category.shooting = 사격 +text.category.optional = Optional Enhancements setting.autotarget.name = 자동 조준 setting.fpscap.name = 최대 FPS setting.fpscap.none = 없음 diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index 066ed3dda9..93a78942b5 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -319,7 +319,8 @@ text.blocks.coolant = Płyn chłodzący text.blocks.coolantuse = Zużycie płynu chłodzącego text.blocks.inputliquidfuel = Paliwo text.blocks.liquidfueluse = Zużycie paliwa -text.blocks.explosive = Wysoce wybuchowy! +text.blocks.boostitem = Boost Item +text.blocks.boostliquid = Boost Liquid text.blocks.health = Zdrowie text.blocks.inaccuracy = Niedokładność text.blocks.shots = Strzały @@ -344,6 +345,7 @@ text.category.liquids = Płyny text.category.items = Przedmioty text.category.crafting = Przetwórstwo text.category.shooting = Strzelanie +text.category.optional = Optional Enhancements setting.autotarget.name = Auto-Target setting.fpscap.name = Max FPS setting.fpscap.none = None diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index faeec32d48..d663e8f5ac 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -319,7 +319,8 @@ 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.explosive = Altamente Explosivo! +text.blocks.boostitem = Boost Item +text.blocks.boostliquid = Boost Liquid text.blocks.health = Saúde text.blocks.inaccuracy = Imprecisão text.blocks.shots = Tiros @@ -344,6 +345,7 @@ 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 setting.fpscap.name = FPS Maximo setting.fpscap.none = Nenhum diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 55866c439f..7218e4051e 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -319,7 +319,8 @@ text.blocks.coolant = Охлаждающая жидкость text.blocks.coolantuse = Охлажд. жидкости используется text.blocks.inputliquidfuel = Жидкое топливо text.blocks.liquidfueluse = Жидкого топлива используется -text.blocks.explosive = Взрывоопасно! +text.blocks.boostitem = Boost Item +text.blocks.boostliquid = Boost Liquid text.blocks.health = Здоровье text.blocks.inaccuracy = Разброс text.blocks.shots = Выстрелы @@ -344,6 +345,7 @@ text.category.liquids = Жидкости text.category.items = Предметы text.category.crafting = Создание text.category.shooting = Cтрельба +text.category.optional = Optional Enhancements setting.autotarget.name = Авто-цель setting.fpscap.name = Макс. FPS setting.fpscap.none = Неограниченный diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties index ec75564ec0..e0476393f0 100644 --- a/core/assets/bundles/bundle_tk.properties +++ b/core/assets/bundles/bundle_tk.properties @@ -319,7 +319,8 @@ text.blocks.coolant = Sogutma sivisi text.blocks.coolantuse = Sogutma sivi kullanimi text.blocks.inputliquidfuel = Yakit sivisi text.blocks.liquidfueluse = Sivi yakit kullanimi -text.blocks.explosive = Patlayici! +text.blocks.boostitem = Boost Item +text.blocks.boostliquid = Boost Liquid text.blocks.health = Can text.blocks.inaccuracy = sekme text.blocks.shots = vuruslar @@ -344,6 +345,7 @@ text.category.liquids = sivilar text.category.items = esyalar text.category.crafting = uretim text.category.shooting = sikma +text.category.optional = Optional Enhancements setting.autotarget.name = Auto-Target setting.fpscap.name = Max FPS setting.fpscap.none = Yok diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index ee943e51a8..d4e7a788b7 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -319,7 +319,8 @@ text.blocks.coolant = Coolant text.blocks.coolantuse = Coolant Use text.blocks.inputliquidfuel = Fuel Liquid text.blocks.liquidfueluse = Liquid Fuel Use -text.blocks.explosive = Çok patlayıcı! +text.blocks.boostitem = Boost Item +text.blocks.boostliquid = Boost Liquid text.blocks.health = Can text.blocks.inaccuracy = yanlışlık text.blocks.shots = atışlar @@ -344,6 +345,7 @@ text.category.liquids = Liquids text.category.items = Items text.category.crafting = Crafting text.category.shooting = Shooting +text.category.optional = Optional Enhancements setting.autotarget.name = Auto-Target setting.fpscap.name = Max FPS setting.fpscap.none = None diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index bca4bcfa58..f5d883551b 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -319,7 +319,8 @@ text.blocks.coolant = Охолоджуюча рідина text.blocks.coolantuse = Охолодж. рідини використовуеться text.blocks.inputliquidfuel = Рідке паливо text.blocks.liquidfueluse = Рідкого палива використовуеться -text.blocks.explosive = Вибухонебезпечний! +text.blocks.boostitem = Boost Item +text.blocks.boostliquid = Boost Liquid text.blocks.health = Здоров'я text.blocks.inaccuracy = Розкид text.blocks.shots = Постріли @@ -344,6 +345,7 @@ text.category.liquids = Рідинне text.category.items = Елементи text.category.crafting = Створення text.category.shooting = Стрільба +text.category.optional = Optional Enhancements setting.autotarget.name = Авто-ціль setting.fpscap.name = Макс. FPS setting.fpscap.none = Необмежений diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index 90313f463f..cc6dbb00bb 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -319,7 +319,8 @@ text.blocks.coolant = 冷却剂 text.blocks.coolantuse = 冷却剂使用速度 text.blocks.inputliquidfuel = 液体燃料输入 text.blocks.liquidfueluse = 液体燃料使用速度 -text.blocks.explosive = 易爆炸! +text.blocks.boostitem = Boost Item +text.blocks.boostliquid = Boost Liquid text.blocks.health = 生命值 text.blocks.inaccuracy = 误差 text.blocks.shots = 发射数 @@ -344,6 +345,7 @@ text.category.liquids = 液体 text.category.items = 物品 text.category.crafting = 制造 text.category.shooting = 发射 +text.category.optional = Optional Enhancements setting.autotarget.name = 自动发射 setting.fpscap.name = 最高 FPS setting.fpscap.none = 无 diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index e98bba92a5..f9ccc2ea8c 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -319,7 +319,8 @@ text.blocks.coolant = 冷卻劑 text.blocks.coolantuse = 使用冷卻劑 text.blocks.inputliquidfuel = 輸入液體燃料 text.blocks.liquidfueluse = 使用液體燃料速度 -text.blocks.explosive = 容易爆炸! +text.blocks.boostitem = Boost Item +text.blocks.boostliquid = Boost Liquid text.blocks.health = 耐久度 text.blocks.inaccuracy = 誤差 text.blocks.shots = 射擊數 @@ -344,6 +345,7 @@ text.category.liquids = 液體 text.category.items = 物品 text.category.crafting = 合成 text.category.shooting = 射擊 +text.category.optional = Optional Enhancements setting.autotarget.name = 自動射擊 setting.fpscap.name = 最大螢幕刷新率 setting.fpscap.none = 没有 From 942eed402ab35b467cf884140560aa4e0f4256f6 Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 22 Nov 2018 23:38:59 -0500 Subject: [PATCH 13/32] uCore update --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 5db17d98cc..f54b84eb8c 100644 --- a/build.gradle +++ b/build.gradle @@ -25,7 +25,7 @@ allprojects { appName = 'Mindustry' gdxVersion = '1.9.9' roboVMVersion = '2.3.0' - uCoreVersion = 'c9aadd4d0b5848dbc4dbbd0fcd701b11c30c02bb' + uCoreVersion = '09e13f973a0769d971316d1d4f4a1eef3570926f' getVersionString = { String buildVersion = getBuildVersion() From 4f56bf3c3e5c6c2bd6d8f3208aa0a27ae51afa49 Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 23 Nov 2018 08:32:56 -0500 Subject: [PATCH 14/32] Consume icon fix / Liquid mixer fix --- .../sprites/ui/icons/icon-liquid-small.png | Bin 0 -> 110 bytes .../sprites/ui/icons/icon-power-small.png | Bin 0 -> 98 bytes core/assets/sprites/sprites.atlas | 908 +++++++++--------- core/assets/sprites/sprites.png | Bin 100178 -> 100476 bytes .../world/blocks/production/LiquidMixer.java | 1 + .../world/consumers/ConsumeLiquid.java | 2 +- .../world/consumers/ConsumeLiquidFilter.java | 2 +- .../world/consumers/ConsumePower.java | 2 +- 8 files changed, 465 insertions(+), 450 deletions(-) create mode 100644 core/assets-raw/sprites/ui/icons/icon-liquid-small.png create mode 100644 core/assets-raw/sprites/ui/icons/icon-power-small.png diff --git a/core/assets-raw/sprites/ui/icons/icon-liquid-small.png b/core/assets-raw/sprites/ui/icons/icon-liquid-small.png new file mode 100644 index 0000000000000000000000000000000000000000..48c93ed9d2b8efc2fe381c718d8114bed0465853 GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0y~yU;weXIM^5%7wjlPW;4ebEMcxMxGtI|Ze?1o6qC2O)_{>A=|=dzopr07mp0 A0{{R3 literal 0 HcmV?d00001 diff --git a/core/assets/sprites/sprites.atlas b/core/assets/sprites/sprites.atlas index 45914d987f..e144699c38 100644 --- a/core/assets/sprites/sprites.atlas +++ b/core/assets/sprites/sprites.atlas @@ -27,280 +27,280 @@ overdrive-projector-top index: -1 bridge-conveyor-bridge rotate: false - xy: 583, 389 + xy: 473, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 bridge-conveyor-end rotate: false - xy: 593, 399 + xy: 483, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-0-1 rotate: false - xy: 793, 389 + xy: 603, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-0-2 rotate: false - xy: 803, 389 + xy: 603, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-0-3 rotate: false - xy: 813, 391 + xy: 613, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-1-0 rotate: false - xy: 823, 391 + xy: 613, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-1-1 rotate: false - xy: 833, 393 + xy: 623, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-1-2 rotate: false - xy: 843, 393 + xy: 623, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-1-3 rotate: false - xy: 853, 393 + xy: 633, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-2-0 rotate: false - xy: 863, 393 + xy: 643, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-2-1 rotate: false - xy: 873, 393 + xy: 653, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-2-2 rotate: false - xy: 883, 393 + xy: 663, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-2-3 rotate: false - xy: 893, 393 + xy: 673, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-3-0 rotate: false - xy: 903, 393 + xy: 683, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-3-1 rotate: false - xy: 913, 393 + xy: 693, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-3-2 rotate: false - xy: 923, 393 + xy: 703, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-3-3 rotate: false - xy: 933, 393 + xy: 713, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-4-0 rotate: false - xy: 943, 393 + xy: 723, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-4-1 rotate: false - xy: 953, 393 + xy: 733, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-4-2 rotate: false - xy: 963, 393 + xy: 743, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-4-3 rotate: false - xy: 973, 393 + xy: 753, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-0-1 rotate: false - xy: 711, 369 + xy: 681, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-0-2 rotate: false - xy: 711, 359 + xy: 691, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-0-3 rotate: false - xy: 721, 369 + xy: 691, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-1-0 rotate: false - xy: 721, 359 + xy: 701, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-1-1 rotate: false - xy: 731, 369 + xy: 701, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-1-2 rotate: false - xy: 731, 359 + xy: 711, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-1-3 rotate: false - xy: 741, 369 + xy: 711, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-2-0 rotate: false - xy: 741, 359 + xy: 721, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-2-1 rotate: false - xy: 751, 369 + xy: 721, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-2-2 rotate: false - xy: 751, 359 + xy: 731, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-2-3 rotate: false - xy: 761, 369 + xy: 731, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-3-0 rotate: false - xy: 761, 359 + xy: 741, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-3-1 rotate: false - xy: 771, 369 + xy: 741, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-3-2 rotate: false - xy: 771, 359 + xy: 751, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-3-3 rotate: false - xy: 781, 369 + xy: 751, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-4-0 rotate: false - xy: 781, 359 + xy: 761, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-4-1 rotate: false - xy: 791, 369 + xy: 761, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-4-2 rotate: false - xy: 791, 359 + xy: 771, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-4-3 rotate: false - xy: 801, 369 + xy: 771, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -314,21 +314,21 @@ mass-driver-turret index: -1 phase-conveyor-arrow rotate: false - xy: 1003, 383 + xy: 953, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 phase-conveyor-bridge rotate: false - xy: 1013, 383 + xy: 963, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 phase-conveyor-end rotate: false - xy: 441, 369 + xy: 973, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -538,35 +538,35 @@ block-icon-blackrock index: -1 blackrockshadow1 rotate: false - xy: 217, 45 + xy: 219, 21 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blackstone1 rotate: false - xy: 217, 35 + xy: 219, 11 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-blackstone rotate: false - xy: 217, 35 + xy: 219, 11 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blackstone2 rotate: false - xy: 227, 49 + xy: 219, 1 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blackstone3 rotate: false - xy: 227, 39 + xy: 229, 49 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -580,56 +580,56 @@ blackstoneedge index: -1 coal1 rotate: false - xy: 593, 389 + xy: 483, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 coal2 rotate: false - xy: 603, 399 + xy: 493, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 coal3 rotate: false - xy: 603, 389 + xy: 493, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 copper1 rotate: false - xy: 983, 393 + xy: 763, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 copper2 rotate: false - xy: 993, 393 + xy: 773, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 copper3 rotate: false - xy: 1003, 393 + xy: 783, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dirt2 rotate: false - xy: 317, 30 + xy: 853, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dirt3 rotate: false - xy: 287, 20 + xy: 863, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -643,98 +643,98 @@ dirtedge index: -1 generic-cliff-edge rotate: false - xy: 337, 14 + xy: 933, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ice-cliff-edge rotate: false - xy: 337, 14 + xy: 933, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 generic-cliff-edge-1 rotate: false - xy: 347, 14 + xy: 943, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ice-cliff-edge-1 rotate: false - xy: 347, 14 + xy: 943, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 generic-cliff-edge-2 rotate: false - xy: 357, 18 + xy: 953, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ice-cliff-edge-2 rotate: false - xy: 357, 18 + xy: 953, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 generic-cliff-side rotate: false - xy: 357, 8 + xy: 963, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ice-cliff-side rotate: false - xy: 357, 8 + xy: 963, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 grass-cliff-edge rotate: false - xy: 351, 376 + xy: 993, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 grass-cliff-edge-1 rotate: false - xy: 351, 366 + xy: 1003, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 grass-cliff-edge-2 rotate: false - xy: 351, 356 + xy: 1013, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 grass-cliff-side rotate: false - xy: 361, 377 + xy: 357, 38 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 grass2 rotate: false - xy: 219, 19 + xy: 973, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 grass3 rotate: false - xy: 219, 9 + xy: 983, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -748,14 +748,14 @@ grassedge index: -1 ice2 rotate: false - xy: 361, 367 + xy: 351, 376 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ice3 rotate: false - xy: 381, 377 + xy: 351, 366 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -769,35 +769,35 @@ iceedge index: -1 icerock2 rotate: false - xy: 371, 367 + xy: 351, 356 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icerockshadow1 rotate: false - xy: 361, 357 + xy: 361, 377 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 rockshadow1 rotate: false - xy: 361, 357 + xy: 361, 377 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icerockshadow2 rotate: false - xy: 391, 377 + xy: 371, 377 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 rockshadow2 rotate: false - xy: 391, 377 + xy: 371, 377 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -811,56 +811,56 @@ lavaedge index: -1 lead1 rotate: false - xy: 352, 296 + xy: 352, 346 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 lead2 rotate: false - xy: 352, 286 + xy: 352, 336 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 lead3 rotate: false - xy: 362, 347 + xy: 352, 326 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor2 rotate: false - xy: 362, 317 + xy: 372, 337 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor3 rotate: false - xy: 402, 347 + xy: 362, 327 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor4 rotate: false - xy: 392, 337 + xy: 392, 347 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor5 rotate: false - xy: 382, 327 + xy: 382, 337 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor6 rotate: false - xy: 372, 317 + xy: 372, 327 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -874,21 +874,21 @@ metalflooredge index: -1 rock2 rotate: false - xy: 501, 369 + xy: 471, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand2 rotate: false - xy: 511, 369 + xy: 481, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand3 rotate: false - xy: 511, 359 + xy: 491, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -902,21 +902,21 @@ sandedge index: -1 shrubshadow rotate: false - xy: 571, 369 + xy: 541, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow2 rotate: false - xy: 571, 359 + xy: 551, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow3 rotate: false - xy: 581, 369 + xy: 551, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -937,42 +937,42 @@ spaceedge index: -1 stone-cliff-edge rotate: false - xy: 641, 369 + xy: 611, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 stone-cliff-edge-1 rotate: false - xy: 641, 359 + xy: 621, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 stone-cliff-edge-2 rotate: false - xy: 651, 369 + xy: 621, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 stone-cliff-side rotate: false - xy: 651, 359 + xy: 631, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 stone2 rotate: false - xy: 631, 369 + xy: 601, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 stone3 rotate: false - xy: 631, 359 + xy: 611, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -993,70 +993,70 @@ taredge index: -1 thorium1 rotate: false - xy: 681, 369 + xy: 651, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 thorium2 rotate: false - xy: 681, 359 + xy: 661, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 thorium3 rotate: false - xy: 691, 369 + xy: 661, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium1 rotate: false - xy: 691, 359 + xy: 671, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium2 rotate: false - xy: 701, 369 + xy: 671, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium3 rotate: false - xy: 701, 359 + xy: 681, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 water-cliff-edge rotate: false - xy: 442, 349 + xy: 781, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 water-cliff-edge-1 rotate: false - xy: 442, 339 + xy: 791, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 water-cliff-edge-2 rotate: false - xy: 452, 349 + xy: 791, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 water-cliff-side rotate: false - xy: 442, 329 + xy: 801, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -1070,63 +1070,63 @@ wateredge index: -1 block-border rotate: false - xy: 237, 26 + xy: 239, 26 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-elevation rotate: false - xy: 247, 26 + xy: 259, 36 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 combustion-generator-top rotate: false - xy: 247, 26 + xy: 259, 36 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-middle rotate: false - xy: 553, 389 + xy: 443, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pump-liquid rotate: false - xy: 553, 389 + xy: 443, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-slope rotate: false - xy: 563, 399 + xy: 453, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 border rotate: false - xy: 563, 389 + xy: 453, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-liquid rotate: false - xy: 713, 389 + xy: 563, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 cross-1 rotate: false - xy: 1013, 393 + xy: 793, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -1161,14 +1161,14 @@ nuclearreactor-shadow index: -1 place-arrow rotate: false - xy: 441, 359 + xy: 983, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ripples rotate: false - xy: 195, 17 + xy: 207, 17 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -1217,7 +1217,7 @@ rubble-3-1 index: -1 shadow-1 rotate: false - xy: 195, 5 + xy: 207, 5 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -1259,14 +1259,14 @@ shadow-6 index: -1 shadow-corner rotate: false - xy: 207, 17 + xy: 217, 43 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 shadow-round-1 rotate: false - xy: 207, 5 + xy: 217, 31 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -1301,161 +1301,161 @@ shadow-rounded-2 index: -1 shadow-shock-mine rotate: false - xy: 561, 369 + xy: 531, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 bridge-conduit-arrow rotate: false - xy: 573, 399 + xy: 463, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 bridge-conveyor-arrow rotate: false - xy: 573, 399 + xy: 463, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 bridge-conduit-bridge rotate: false - xy: 573, 389 + xy: 463, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 bridge-conduit-end rotate: false - xy: 583, 399 + xy: 473, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-bottom rotate: false - xy: 633, 389 + xy: 523, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-bottom-0 rotate: false - xy: 643, 389 + xy: 523, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-bottom-1 rotate: false - xy: 653, 389 + xy: 533, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-bottom-2 rotate: false - xy: 663, 389 + xy: 533, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-bottom-3 rotate: false - xy: 673, 389 + xy: 543, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-bottom-4 rotate: false - xy: 683, 389 + xy: 543, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-bottom-5 rotate: false - xy: 693, 389 + xy: 553, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-bottom-6 rotate: false - xy: 703, 389 + xy: 553, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-top-0 rotate: false - xy: 723, 389 + xy: 563, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-top-1 rotate: false - xy: 733, 389 + xy: 573, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-top-2 rotate: false - xy: 743, 389 + xy: 573, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-top-3 rotate: false - xy: 753, 389 + xy: 583, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-top-4 rotate: false - xy: 763, 389 + xy: 583, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-top-5 rotate: false - xy: 773, 389 + xy: 593, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conduit-top-6 rotate: false - xy: 783, 389 + xy: 593, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-router-bottom rotate: false - xy: 392, 347 + xy: 372, 347 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-router-liquid rotate: false - xy: 382, 337 + xy: 362, 337 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-router-top rotate: false - xy: 372, 327 + xy: 382, 347 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -1483,70 +1483,70 @@ liquid-tank-top index: -1 phase-conduit-arrow rotate: false - xy: 973, 383 + xy: 923, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 phase-conduit-bridge rotate: false - xy: 983, 383 + xy: 933, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 phase-conduit-end rotate: false - xy: 993, 383 + xy: 943, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulse-conduit-top-0 rotate: false - xy: 451, 369 + xy: 993, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulse-conduit-top-1 rotate: false - xy: 451, 359 + xy: 1003, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulse-conduit-top-2 rotate: false - xy: 461, 369 + xy: 1013, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulse-conduit-top-3 rotate: false - xy: 461, 359 + xy: 441, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulse-conduit-top-4 rotate: false - xy: 471, 369 + xy: 441, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulse-conduit-top-5 rotate: false - xy: 471, 359 + xy: 451, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulse-conduit-top-6 rotate: false - xy: 481, 369 + xy: 451, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -1651,7 +1651,7 @@ fusion-reactor-top index: -1 rtg-generator-top rotate: false - xy: 501, 359 + xy: 481, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -1833,14 +1833,14 @@ cultivator-top index: -1 lavasmelter rotate: false - xy: 352, 306 + xy: 431, 357 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 oilrefinery rotate: false - xy: 382, 317 + xy: 372, 317 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -1875,21 +1875,21 @@ plastanium-compressor-top index: -1 pulverizer rotate: false - xy: 481, 359 + xy: 461, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulverizer-rotator rotate: false - xy: 491, 369 + xy: 461, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 separator-liquid rotate: false - xy: 551, 359 + xy: 531, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -1910,21 +1910,21 @@ core-top index: -1 sortedunloader rotate: false - xy: 601, 359 + xy: 581, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-1 rotate: false - xy: 267, 36 + xy: 239, 36 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-1-top rotate: false - xy: 277, 36 + xy: 249, 36 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -1994,7 +1994,7 @@ cyclone index: -1 duo rotate: false - xy: 347, 24 + xy: 923, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -2008,7 +2008,7 @@ fuse index: -1 hail rotate: false - xy: 371, 377 + xy: 357, 28 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -2092,21 +2092,21 @@ salvo-panel-right index: -1 scatter rotate: false - xy: 541, 369 + xy: 511, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 scorch rotate: false - xy: 541, 359 + xy: 521, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 scorch-shoot rotate: false - xy: 551, 369 + xy: 521, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -2232,7 +2232,7 @@ reconstructor-open index: -1 repair-point-turret rotate: false - xy: 491, 359 + xy: 471, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -2295,7 +2295,7 @@ wraith-factory-top-open index: -1 deflector-wall rotate: false - xy: 307, 30 + xy: 843, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -2316,7 +2316,7 @@ door-large-open index: -1 door-open rotate: false - xy: 337, 24 + xy: 913, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -2372,35 +2372,35 @@ clear index: -1 command-attack rotate: false - xy: 613, 399 + xy: 503, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 command-idle rotate: false - xy: 613, 389 + xy: 503, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 command-patrol rotate: false - xy: 623, 399 + xy: 513, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 command-retreat rotate: false - xy: 623, 389 + xy: 513, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 enemyarrow rotate: false - xy: 327, 15 + xy: 289, 1 size: 8, 7 orig: 8, 7 offset: 0, 0 @@ -2512,7 +2512,7 @@ shell-back index: -1 shot rotate: false - xy: 561, 359 + xy: 541, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -2526,7 +2526,7 @@ transfer index: -1 transfer-arrow rotate: false - xy: 801, 359 + xy: 781, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -2540,35 +2540,35 @@ transfer-end index: -1 blackstone-cliff-edge rotate: false - xy: 227, 29 + xy: 229, 39 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blackstone-cliff-edge-1 rotate: false - xy: 237, 36 + xy: 229, 29 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blackstone-cliff-edge-2 rotate: false - xy: 247, 36 + xy: 229, 19 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blackstone-cliff-side rotate: false - xy: 257, 36 + xy: 229, 9 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-arc rotate: false - xy: 257, 26 + xy: 239, 16 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -2589,28 +2589,28 @@ block-icon-blast-drill index: -1 block-icon-bridge-conduit rotate: false - xy: 267, 26 + xy: 249, 26 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 bridge-conduit rotate: false - xy: 267, 26 + xy: 249, 26 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-bridge-conveyor rotate: false - xy: 277, 26 + xy: 269, 36 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 bridge-conveyor rotate: false - xy: 277, 26 + xy: 269, 36 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -2631,14 +2631,14 @@ centrifuge index: -1 block-icon-combustion-generator rotate: false - xy: 343, 396 + xy: 249, 16 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 combustion-generator rotate: false - xy: 343, 396 + xy: 249, 16 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -2659,7 +2659,7 @@ command-center index: -1 block-icon-conduit rotate: false - xy: 353, 397 + xy: 259, 26 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -2680,28 +2680,28 @@ container index: -1 block-icon-conveyor rotate: false - xy: 363, 397 + xy: 279, 36 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 conveyor-0-0 rotate: false - xy: 363, 397 + xy: 279, 36 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-copper-wall rotate: false - xy: 373, 397 + xy: 259, 16 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 copper-wall rotate: false - xy: 373, 397 + xy: 259, 16 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -2778,14 +2778,14 @@ dart-ship-pad index: -1 block-icon-deepwater rotate: false - xy: 383, 397 + xy: 269, 26 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 deepwater rotate: false - xy: 383, 397 + xy: 269, 26 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -2806,14 +2806,14 @@ delta-mech-pad index: -1 block-icon-dense-alloy-wall rotate: false - xy: 393, 397 + xy: 269, 16 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dense-alloy-wall rotate: false - xy: 393, 397 + xy: 269, 16 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -2834,14 +2834,14 @@ dense-alloy-wall-large index: -1 block-icon-dirt rotate: false - xy: 403, 397 + xy: 279, 26 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dirt1 rotate: false - xy: 403, 397 + xy: 279, 26 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -2862,14 +2862,14 @@ distributor index: -1 block-icon-door rotate: false - xy: 413, 397 + xy: 279, 16 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 door rotate: false - xy: 413, 397 + xy: 279, 16 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -2890,7 +2890,7 @@ door-large index: -1 block-icon-duo rotate: false - xy: 423, 397 + xy: 239, 6 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -2953,91 +2953,91 @@ glaive-ship-pad index: -1 block-icon-grass rotate: false - xy: 343, 386 + xy: 249, 6 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 grass1 rotate: false - xy: 343, 386 + xy: 249, 6 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-hail rotate: false - xy: 353, 387 + xy: 259, 6 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-ice rotate: false - xy: 363, 387 + xy: 269, 6 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ice1 rotate: false - xy: 363, 387 + xy: 269, 6 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-icerock rotate: false - xy: 373, 387 + xy: 279, 6 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icerock1 rotate: false - xy: 373, 387 + xy: 279, 6 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-incinerator rotate: false - xy: 383, 387 + xy: 289, 30 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 incinerator rotate: false - xy: 383, 387 + xy: 289, 30 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-itemsource rotate: false - xy: 393, 387 + xy: 299, 30 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 itemsource rotate: false - xy: 393, 387 + xy: 299, 30 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-itemvoid rotate: false - xy: 403, 387 + xy: 289, 20 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 itemvoid rotate: false - xy: 403, 387 + xy: 289, 20 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -3058,14 +3058,14 @@ javelin-ship-pad index: -1 block-icon-junction rotate: false - xy: 413, 387 + xy: 309, 30 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 junction rotate: false - xy: 413, 387 + xy: 309, 30 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -3086,35 +3086,35 @@ block-icon-laser-drill index: -1 block-icon-lava rotate: false - xy: 423, 387 + xy: 289, 10 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 lava rotate: false - xy: 423, 387 + xy: 289, 10 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-liquid-junction rotate: false - xy: 341, 376 + xy: 299, 20 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-junction rotate: false - xy: 341, 376 + xy: 299, 20 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-liquid-router rotate: false - xy: 341, 366 + xy: 299, 10 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: 341, 356 + xy: 309, 20 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquidsource rotate: false - xy: 341, 356 + xy: 309, 20 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -3163,14 +3163,14 @@ block-icon-mechanical-drill index: -1 block-icon-mechanical-pump rotate: false - xy: 342, 346 + xy: 309, 10 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 mechanical-pump rotate: false - xy: 342, 346 + xy: 309, 10 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -3184,14 +3184,14 @@ block-icon-meltdown index: -1 block-icon-melter rotate: false - xy: 342, 336 + xy: 343, 396 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 melter rotate: false - xy: 342, 336 + xy: 343, 396 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -3212,14 +3212,14 @@ mend-projector index: -1 block-icon-metalfloor rotate: false - xy: 342, 326 + xy: 353, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor1 rotate: false - xy: 342, 326 + xy: 353, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -3261,14 +3261,14 @@ overdrive-projector index: -1 block-icon-overflow-gate rotate: false - xy: 342, 316 + xy: 363, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 overflow-gate rotate: false - xy: 342, 316 + xy: 363, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -3282,42 +3282,42 @@ block-icon-phantom-factory index: -1 block-icon-phase-conduit rotate: false - xy: 342, 306 + xy: 373, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 phase-conduit rotate: false - xy: 342, 306 + xy: 373, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-phase-conveyor rotate: false - xy: 342, 296 + xy: 383, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 phase-conveyor rotate: false - xy: 342, 296 + xy: 383, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-phase-wall rotate: false - xy: 342, 286 + xy: 393, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 phase-wall rotate: false - xy: 342, 286 + xy: 393, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -3373,14 +3373,14 @@ block-icon-pneumatic-drill index: -1 block-icon-power-node rotate: false - xy: 1014, 432 + xy: 403, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 power-node rotate: false - xy: 1014, 432 + xy: 403, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -3401,42 +3401,42 @@ power-node-large index: -1 block-icon-powerinfinite rotate: false - xy: 1014, 422 + xy: 413, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 powerinfinite rotate: false - xy: 1014, 422 + xy: 413, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-powervoid rotate: false - xy: 433, 397 + xy: 423, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 powervoid rotate: false - xy: 433, 397 + xy: 423, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-pulse-conduit rotate: false - xy: 433, 387 + xy: 343, 386 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-pulverizer rotate: false - xy: 443, 399 + xy: 353, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -3499,14 +3499,14 @@ wraith-factory index: -1 block-icon-repair-point rotate: false - xy: 443, 389 + xy: 363, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 repair-point rotate: false - xy: 443, 389 + xy: 363, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -3527,14 +3527,14 @@ block-icon-ripple index: -1 block-icon-rock rotate: false - xy: 453, 399 + xy: 373, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 rock1 rotate: false - xy: 453, 399 + xy: 373, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -3555,14 +3555,14 @@ rotary-pump index: -1 block-icon-router rotate: false - xy: 453, 389 + xy: 383, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 router rotate: false - xy: 453, 389 + xy: 383, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -3590,63 +3590,63 @@ block-icon-salvo index: -1 block-icon-sand rotate: false - xy: 463, 399 + xy: 393, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand1 rotate: false - xy: 463, 399 + xy: 393, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-scorch rotate: false - xy: 463, 389 + xy: 403, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-separator rotate: false - xy: 473, 399 + xy: 413, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 separator rotate: false - xy: 473, 399 + xy: 413, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-shock-mine rotate: false - xy: 473, 389 + xy: 423, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 shock-mine rotate: false - xy: 473, 389 + xy: 423, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-shrub rotate: false - xy: 483, 399 + xy: 341, 376 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 shrub rotate: false - xy: 483, 399 + xy: 341, 376 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -3667,42 +3667,42 @@ silicon-smelter index: -1 block-icon-smelter rotate: false - xy: 483, 389 + xy: 341, 366 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 smelter rotate: false - xy: 483, 389 + xy: 341, 366 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-snow rotate: false - xy: 493, 399 + xy: 341, 356 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow1 rotate: false - xy: 493, 399 + xy: 341, 356 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-solar-panel rotate: false - xy: 493, 389 + xy: 342, 346 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 solar-panel rotate: false - xy: 493, 389 + xy: 342, 346 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -3723,56 +3723,56 @@ solar-panel-large index: -1 block-icon-solidifer rotate: false - xy: 503, 399 + xy: 342, 336 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 solidifer rotate: false - xy: 503, 399 + xy: 342, 336 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-sorter rotate: false - xy: 503, 389 + xy: 342, 326 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sorter rotate: false - xy: 503, 389 + xy: 342, 326 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-space rotate: false - xy: 513, 399 + xy: 342, 316 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 space rotate: false - xy: 513, 399 + xy: 342, 316 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-spawn rotate: false - xy: 513, 389 + xy: 342, 306 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 spawn rotate: false - xy: 513, 389 + xy: 342, 306 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -3793,28 +3793,28 @@ block-icon-spirit-factory index: -1 block-icon-stone rotate: false - xy: 523, 399 + xy: 342, 296 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 stone1 rotate: false - xy: 523, 399 + xy: 342, 296 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 block-icon-surge-wall rotate: false - xy: 523, 389 + xy: 342, 286 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 surge-wall rotate: false - xy: 523, 389 + xy: 342, 286 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -3842,14 +3842,14 @@ block-icon-swarmer index: -1 block-icon-tar rotate: false - xy: 533, 399 + xy: 1014, 432 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 tar rotate: false - xy: 533, 399 + xy: 1014, 432 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -3912,14 +3912,14 @@ thorium-reactor index: -1 block-icon-thorium-wall rotate: false - xy: 533, 389 + xy: 1014, 422 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 thorium-wall rotate: false - xy: 533, 389 + xy: 1014, 422 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -3947,14 +3947,14 @@ block-icon-titan-factory index: -1 block-icon-titanium-conveyor rotate: false - xy: 543, 399 + xy: 433, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium-conveyor-0-0 rotate: false - xy: 543, 399 + xy: 433, 397 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -3989,14 +3989,14 @@ turbine-generator index: -1 block-icon-unloader rotate: false - xy: 543, 389 + xy: 433, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 unloader rotate: false - xy: 543, 389 + xy: 433, 387 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -4017,14 +4017,14 @@ vault index: -1 block-icon-water rotate: false - xy: 553, 399 + xy: 443, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 water rotate: false - xy: 553, 399 + xy: 443, 399 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -4052,112 +4052,112 @@ block-icon-wraith-factory index: -1 deepwater-cliff-edge rotate: false - xy: 357, 38 + xy: 803, 389 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 deepwater-cliff-edge-1 rotate: false - xy: 357, 28 + xy: 813, 391 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 deepwater-cliff-edge-2 rotate: false - xy: 287, 30 + xy: 823, 391 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 deepwater-cliff-side rotate: false - xy: 297, 30 + xy: 833, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dirt-cliff-edge rotate: false - xy: 297, 20 + xy: 873, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dirt-cliff-edge-1 rotate: false - xy: 307, 20 + xy: 883, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dirt-cliff-edge-2 rotate: false - xy: 317, 20 + xy: 893, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 dirt-cliff-side rotate: false - xy: 327, 24 + xy: 903, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 lava-cliff-edge rotate: false - xy: 352, 346 + xy: 421, 367 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 lava-cliff-edge-1 rotate: false - xy: 352, 336 + xy: 411, 357 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 lava-cliff-edge-2 rotate: false - xy: 352, 326 + xy: 431, 367 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 lava-cliff-side rotate: false - xy: 352, 316 + xy: 421, 357 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-icon-cryofluid rotate: false - xy: 362, 337 + xy: 352, 306 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-icon-lava rotate: false - xy: 382, 347 + xy: 352, 296 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-icon-oil rotate: false - xy: 372, 337 + xy: 352, 286 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-icon-water rotate: false - xy: 362, 327 + xy: 362, 347 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -4213,770 +4213,770 @@ trident-ship index: -1 metalfloor-cliff-edge rotate: false - xy: 362, 307 + xy: 362, 317 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor-cliff-edge-1 rotate: false - xy: 412, 347 + xy: 402, 347 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor-cliff-edge-2 rotate: false - xy: 402, 337 + xy: 392, 337 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor-cliff-side rotate: false - xy: 392, 327 + xy: 382, 327 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-blackstone1 rotate: false - xy: 372, 307 + xy: 362, 307 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-blackstone2 rotate: false - xy: 362, 297 + xy: 412, 347 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-blackstone3 rotate: false - xy: 422, 347 + xy: 402, 337 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-grass1 rotate: false - xy: 412, 337 + xy: 392, 327 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-grass2 rotate: false - xy: 402, 327 + xy: 382, 317 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-grass3 rotate: false - xy: 392, 317 + xy: 372, 307 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-ice1 rotate: false - xy: 382, 307 + xy: 362, 297 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-ice2 rotate: false - xy: 372, 297 + xy: 422, 347 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-ice3 rotate: false - xy: 362, 287 + xy: 412, 337 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-sand1 rotate: false - xy: 422, 337 + xy: 402, 327 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-sand2 rotate: false - xy: 412, 327 + xy: 392, 317 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-sand3 rotate: false - xy: 402, 317 + xy: 382, 307 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-snow1 rotate: false - xy: 392, 307 + xy: 372, 297 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-snow2 rotate: false - xy: 382, 297 + xy: 362, 287 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-snow3 rotate: false - xy: 372, 287 + xy: 422, 337 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-stone1 rotate: false - xy: 422, 327 + xy: 412, 327 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-stone2 rotate: false - xy: 412, 317 + xy: 402, 317 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-stone3 rotate: false - xy: 402, 307 + xy: 392, 307 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-blackstone1 rotate: false - xy: 392, 297 + xy: 382, 297 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-blackstone2 rotate: false - xy: 382, 287 + xy: 372, 287 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-blackstone3 rotate: false - xy: 422, 317 + xy: 422, 327 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-grass1 rotate: false - xy: 412, 307 + xy: 412, 317 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-grass2 rotate: false - xy: 402, 297 + xy: 402, 307 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-grass3 rotate: false - xy: 392, 287 + xy: 392, 297 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-ice1 rotate: false - xy: 422, 307 + xy: 382, 287 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-ice2 rotate: false - xy: 412, 297 + xy: 422, 317 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-ice3 rotate: false - xy: 402, 287 + xy: 412, 307 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-sand1 rotate: false - xy: 422, 297 + xy: 402, 297 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-sand2 rotate: false - xy: 412, 287 + xy: 392, 287 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-sand3 rotate: false - xy: 422, 287 + xy: 422, 307 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-snow1 rotate: false - xy: 432, 347 + xy: 412, 297 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-snow2 rotate: false - xy: 432, 337 + xy: 402, 287 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-snow3 rotate: false - xy: 432, 327 + xy: 422, 297 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-stone1 rotate: false - xy: 432, 317 + xy: 412, 287 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-stone2 rotate: false - xy: 432, 307 + xy: 422, 287 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-copper-stone3 rotate: false - xy: 432, 297 + xy: 432, 347 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-blackstone1 rotate: false - xy: 432, 287 + xy: 432, 337 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-blackstone2 rotate: false - xy: 443, 379 + xy: 432, 327 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-blackstone3 rotate: false - xy: 453, 379 + xy: 432, 317 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-grass1 rotate: false - xy: 463, 379 + xy: 432, 307 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-grass2 rotate: false - xy: 473, 379 + xy: 432, 297 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-grass3 rotate: false - xy: 483, 379 + xy: 432, 287 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-ice1 rotate: false - xy: 493, 379 + xy: 443, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-ice2 rotate: false - xy: 503, 379 + xy: 453, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-ice3 rotate: false - xy: 513, 379 + xy: 463, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-sand1 rotate: false - xy: 523, 379 + xy: 473, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-sand2 rotate: false - xy: 533, 379 + xy: 483, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-sand3 rotate: false - xy: 543, 379 + xy: 493, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-snow1 rotate: false - xy: 553, 379 + xy: 503, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-snow2 rotate: false - xy: 563, 379 + xy: 513, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-snow3 rotate: false - xy: 573, 379 + xy: 523, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-stone1 rotate: false - xy: 583, 379 + xy: 533, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-stone2 rotate: false - xy: 593, 379 + xy: 543, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-stone3 rotate: false - xy: 603, 379 + xy: 553, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-blackstone1 rotate: false - xy: 613, 379 + xy: 563, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-blackstone2 rotate: false - xy: 623, 379 + xy: 573, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-blackstone3 rotate: false - xy: 633, 379 + xy: 583, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-grass1 rotate: false - xy: 643, 379 + xy: 593, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-grass2 rotate: false - xy: 653, 379 + xy: 603, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-grass3 rotate: false - xy: 663, 379 + xy: 613, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-ice1 rotate: false - xy: 673, 379 + xy: 623, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-ice2 rotate: false - xy: 683, 379 + xy: 633, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-ice3 rotate: false - xy: 693, 379 + xy: 643, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-sand1 rotate: false - xy: 703, 379 + xy: 653, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-sand2 rotate: false - xy: 713, 379 + xy: 663, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-sand3 rotate: false - xy: 723, 379 + xy: 673, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-snow1 rotate: false - xy: 733, 379 + xy: 683, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-snow2 rotate: false - xy: 743, 379 + xy: 693, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-snow3 rotate: false - xy: 753, 379 + xy: 703, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-stone1 rotate: false - xy: 763, 379 + xy: 713, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-stone2 rotate: false - xy: 773, 379 + xy: 723, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-stone3 rotate: false - xy: 783, 379 + xy: 733, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-blackstone1 rotate: false - xy: 793, 379 + xy: 743, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-blackstone2 rotate: false - xy: 803, 379 + xy: 753, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-blackstone3 rotate: false - xy: 813, 381 + xy: 763, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-grass1 rotate: false - xy: 823, 381 + xy: 773, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-grass2 rotate: false - xy: 833, 383 + xy: 783, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-grass3 rotate: false - xy: 843, 383 + xy: 793, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-ice1 rotate: false - xy: 853, 383 + xy: 803, 379 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-ice2 rotate: false - xy: 863, 383 + xy: 813, 381 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-ice3 rotate: false - xy: 873, 383 + xy: 823, 381 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-sand1 rotate: false - xy: 883, 383 + xy: 833, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-sand2 rotate: false - xy: 893, 383 + xy: 843, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-sand3 rotate: false - xy: 903, 383 + xy: 853, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-snow1 rotate: false - xy: 913, 383 + xy: 863, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-snow2 rotate: false - xy: 923, 383 + xy: 873, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-snow3 rotate: false - xy: 933, 383 + xy: 883, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-stone1 rotate: false - xy: 943, 383 + xy: 893, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-stone2 rotate: false - xy: 953, 383 + xy: 903, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-stone3 rotate: false - xy: 963, 383 + xy: 913, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand-cliff-edge rotate: false - xy: 521, 369 + xy: 491, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand-cliff-edge-1 rotate: false - xy: 521, 359 + xy: 501, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand-cliff-edge-2 rotate: false - xy: 531, 369 + xy: 501, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand-cliff-side rotate: false - xy: 531, 359 + xy: 511, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow-cliff-edge rotate: false - xy: 581, 359 + xy: 561, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow-cliff-edge-1 rotate: false - xy: 591, 369 + xy: 561, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow-cliff-edge-2 rotate: false - xy: 591, 359 + xy: 571, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow-cliff-side rotate: false - xy: 601, 369 + xy: 571, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 space-cliff-edge rotate: false - xy: 611, 369 + xy: 581, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 space-cliff-edge-1 rotate: false - xy: 611, 359 + xy: 591, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 space-cliff-edge-2 rotate: false - xy: 621, 369 + xy: 591, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 space-cliff-side rotate: false - xy: 621, 359 + xy: 601, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 tar-cliff-edge rotate: false - xy: 661, 369 + xy: 631, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 tar-cliff-edge-1 rotate: false - xy: 661, 359 + xy: 641, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 tar-cliff-edge-2 rotate: false - xy: 671, 369 + xy: 641, 359 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 tar-cliff-side rotate: false - xy: 671, 359 + xy: 651, 369 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -5018,112 +5018,112 @@ wraith index: -1 item-biomatter rotate: false - xy: 401, 377 + xy: 371, 367 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-blast-compound rotate: false - xy: 391, 367 + xy: 361, 357 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-coal rotate: false - xy: 381, 357 + xy: 391, 377 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-copper rotate: false - xy: 411, 377 + xy: 381, 367 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-dense-alloy rotate: false - xy: 401, 367 + xy: 371, 357 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-lead rotate: false - xy: 391, 357 + xy: 401, 377 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-phase-fabric rotate: false - xy: 421, 377 + xy: 391, 367 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-plastanium rotate: false - xy: 411, 367 + xy: 381, 357 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-pyratite rotate: false - xy: 401, 357 + xy: 411, 377 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-sand rotate: false - xy: 431, 377 + xy: 401, 367 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-silicon rotate: false - xy: 421, 367 + xy: 391, 357 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-stone rotate: false - xy: 411, 357 + xy: 421, 377 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-surge-alloy rotate: false - xy: 431, 367 + xy: 411, 367 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-thorium rotate: false - xy: 421, 357 + xy: 401, 357 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 item-titanium rotate: false - xy: 431, 357 + xy: 431, 377 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquid-icon rotate: false - xy: 372, 347 + xy: 352, 316 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -5780,7 +5780,7 @@ icon-item index: -1 icon-items-none rotate: false - xy: 381, 367 + xy: 361, 367 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -5799,6 +5799,13 @@ icon-link orig: 14, 14 offset: 0, 0 index: -1 +icon-liquid-small + rotate: false + xy: 159, 9 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 icon-load rotate: false xy: 730, 399 @@ -5836,7 +5843,7 @@ icon-locked index: -1 icon-logic rotate: false - xy: 159, 9 + xy: 181, 37 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -5850,7 +5857,7 @@ icon-map index: -1 icon-menu rotate: false - xy: 181, 37 + xy: 181, 25 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -5864,7 +5871,7 @@ icon-menu-large index: -1 icon-missing rotate: false - xy: 181, 25 + xy: 171, 13 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -5878,42 +5885,42 @@ icon-mission-background index: -1 icon-mission-battle rotate: false - xy: 171, 13 + xy: 171, 1 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-mission-defense rotate: false - xy: 171, 1 + xy: 183, 13 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-mission-done rotate: false - xy: 183, 13 + xy: 183, 1 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-none rotate: false - xy: 183, 1 + xy: 190, 53 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-nullitem rotate: false - xy: 371, 357 + xy: 381, 377 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icon-pause rotate: false - xy: 190, 53 + xy: 202, 53 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -5941,7 +5948,7 @@ icon-pick index: -1 icon-play rotate: false - xy: 202, 53 + xy: 193, 41 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -5955,7 +5962,14 @@ icon-play-2 index: -1 icon-players rotate: false - xy: 193, 41 + xy: 193, 29 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +icon-power-small + rotate: false + xy: 205, 41 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -6046,7 +6060,7 @@ icon-save-map index: -1 icon-settings rotate: false - xy: 193, 29 + xy: 205, 29 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -6067,14 +6081,14 @@ icon-tools index: -1 icon-touch rotate: false - xy: 205, 41 + xy: 195, 17 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 icon-touchDelete rotate: false - xy: 205, 29 + xy: 195, 5 size: 10, 10 orig: 10, 10 offset: 0, 0 diff --git a/core/assets/sprites/sprites.png b/core/assets/sprites/sprites.png index 14160e25816ecd9da8438eaa4744aebf65b2fe28..205363eea19fc45fc3e435cf985148979854fcf8 100644 GIT binary patch delta 99407 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
  • )h{Z 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�Yl}k8Iu^i7!=agC;a!Gf0MIjPhCyJvb<@` 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 delta 99232 zcmew}f$dTs+XVf3(d%>H@4Wu1^#82L?5byF-@VSinr(f#`172S`+nAU=RP@B>2tp1 zSK0BqnaR@24<0j<$oagX_h3i+#EMsq4ju{)k5oBz1f2FvWK2%pz<4|1z%l;~&O+9O zQnxo2Kfcj9x#aB6+*jfEwr0Oy66d(t#+49?K@{FRAXQNdwaco;aSt` z70e<{hd%F#aSpvydD=!lbDwASEpzsZ8+ZEW+`Xw^CR?RrSQ5LvZb~pu`P08U3xCdW z5MXfxqtGc@tPCQIoO`weG$y%bvokaFFG_efS&50kWb%7W#VwB+m@a&mGtY}zwSuLY zn}GqM%Td6jhM{44JrhGkUt3(L7Q=-LJKWsD7!o3$`m->IWS+HmXJu?qxoKy;u~?C# zNdb%)7`(U{_J};Yzj^Jo<%VB5ml^Oev^+aA^R`CvDO*!HR>y|>bLITPu>QBAeE!>;!b}W%ZvCHqjnn9bg(9;;%7^1`q~@D(GcX*GWw>FN zKQHmCJVQN$*7ox@Sz*x7{Q2VY{C``_1q!c*hI4iaF*gLIGWBdKp@mKI*4&JKVbdx4i$ZK+EYlGp_Fld1&dRqR+_0 z!@=P3+s^rLa3q5U)TmG?1`m_(>t1fsd&?U8?&hYXWDbTKO}AOfa^4AxtgB~GNV9f` zWNrwOtULYLV3yM1nDdH{nHdVfN3GKmKK}L{0Div1V>?>iG6G zdd@Zml`AYKxEYSDTM&JwK4l#j!=-Ea9h#S(zkKg2)Z<~@zj)U!DFy~DcZLUy4A3xk zmSafy(O=-nl_*+mU(d=Ak$mos+rHovGk_(Xj5%4@X7@!^nC$1_lO(%|}7bYc4M?%EeUlo_qdfF^1_;jFFfA zx32wh-+`fF+cq;$6777we!ra{!v&dH(L4+tFF!Ca7`QMn%zn?p@L*|1?kmeP?C?~{ z&#+_Gf3HS{oL|r0#cNcZ`_lUFbN!2@_3lq1&Z((wS8C{EIN&|eaKf`W(*>Da)>+s7 z+HzxCZgkSu(piTOC>;C~9CMA)!Ks~{p~1-X_qOxNO+UX2g?(d$#{k3G2i4P7a4<}` z_~+Tj+M-ksy{kO zYGc|@rHy&1dwHyu8J6<7N7-&lFU}ERWUvut&|nIXe7-YJ9h$cmcrh_FKAd0V-^(M+ zvciF3LWWEc3vcGC-{N=6`b+K}*}EwHzxJXNSN@tX9N6|~*0CS$`ezpMJ}6*k5J~xE zzAkTy<8igm_8treif=Z*-|=gHRcgIF0|TTiVPcSwV>ocqhR2oRfD(g%c)Q$x$7$a( zBCUlP7L52k5FJhbDYsTA3Gd%b>{hV!N4qL5=|UQ)?KoiQQB^S8b>L&6QNfQt+ZN?+E*y*$stFe&WYWrl_&+4p}O zWPL8h;JW6GIO_&zE?A+&;Bfs~Y|`g#wkhjuxy=6knQ`vooFFEK@Xzr)EFPH-%|H3e z-g7A&IJ7HF(s!-wr^2gi>VHjQV)!K|{BDNYvEKdeJyNx+f86_?Cv-iodMzkEtlWzw z+#Vik!x?+l*>zWcL_0XhFnmbz*`N1k?~I?@vY&qcvt7R3 zIB4JhPn#dTT<+iT*S)WEUb}xsUo3z3K4$kL#`-ZGf7kr|@%Hz zgF{Sc{rx}16;US&XH71dpXBrIQ`5q}O1_29Cy6qp7%VJ$_t1Tw0Jqpyj(bv$=Uew( zx^d6+}?PsH&T>4#4l6SS)spBbMeij#fS-JV(p5XO= z4Ax~NEbC!{IFUn2h~YrmE%B@CrW`AKI!o_o#95|*@c%Dk(!cvHOk;Y&%2<&)cTs9+ z`kbHoQcNi(i;CXO+1Wc$SIER{d)my8)mN`xl{}umBe5oD#Uov|DTNLP7AE}ITW|e- zmdu`eB|ga|=jJQF+q2)e_oI0lQwSG>#&kV~KXqHz-&e9S``)?rZoA9fTa%MsU3#9P zbF;!L=hoi}mD5Yt|KD(9*XH<=+?%S+eVIMSU&fW37hNm6sBzm;5j%a65})L?x@RX! zG3YTIIJkw|z4(37zgP!G>FWNZH$P6!tJmqR-)E+F-28p5$;P>vx7IO1D`^uE#s-u1 z-m|ZLTD7fM+Tk3_g;%Uk*cf(vSg?!N@qXU|=Y}n(xEN1_yp&{MVR$utjoH6HwzjrH zOa>etM*q|V97@^#tY!ODJ?Z9r%iUHLZ(q(h_T%S;J5#j(XEHdfntIWO(IGlIx**z+ zrMsSC)qdraTPOESeks5IgR5jo&h1x++~%*peEjFWFF%)@S7w#{{G)5x(v=JhqI@N> z8|4pFCOux}>&9>(!GV=wisFTBE6->BfH6SQp;s>Seu=juOIjt;~BMpJT` z!W;rr7&uDh1LRjHIJ7e`C;t1&(@=lE`l;pB`fJ;L?#eSJ>;l*g&6jSdFqKmC@G+%8$SmyaP=d_gYrI_+;uc#hpG^>$R*_jUXIX$RHf z?}{A|XlRnFHx^kqfBwIHKWF;LISV(<_!ZW$uX%bBGo(yv(qd$g@O8e!RinwsP_O^h zGE%`oi{ZhA$M>=dG6edT=x7Tz|^P;PXsPo1wtq|Hj8_SMOGe z8J!-8GAZgDdFSXQ@z zq2b@2=Hprpi@x{v{C{aIzIXfmx@fuCJo|oG8uxyDf6V^RVs$vnaO2KZ z>FhVw^WO>kihu9=R&4G1z4Knj%=eWmyi2~W5zD?ky+D>}V_v=M+80^TTHDs-^BrCH zZrhQbX4$*auF=`EXT)vwIksr2bQ2Fl8$;HL_1}Z}%_{Bft_$zU+futI{X65&dy!}M zEwA~?0IvcY7IHJ#w2PH4G~DWUaLaFT&cm-oPcZ~+XWFodfnhHj!+yPG$!pmh?lByg zrYp$MAajdNt*xGou_q~bzM98mHD9izzrVgdIy2MwT=fCrO|mvmjaBZe8~rKwt5#xQ z;GKPsKb7gmrjinc1$~nrh96GlZdl94kXaVH-(+vE_BWPeHFtk$FT1bVSJL%#_H3rl z^F{P#GGsC^?7x@tPm)1Hz(FjC1>PEvW8j&p%TV>IxZaQ9!09BP$MY6Pb@=N3N@r$x ztbRry=UeDw|M-`4xEOYDGe}mmF)mvxcuX&Tvr2UL=0r94VvXsF@4BW389^6GfsY_<2r zpU(y>xiVz-oVzH)#_(kZ$ULrfpU#EeublJjj&b(ddI{T=+QH%tOJDnS3!ne9BjuU> zv)T=5Vis3~K73knY2D2F{(bN6@3;S!?#a!t&-$a`!RmjNU+3?;^lJYs)&=QIAJW%J zFgVPgyzA)JOAquTHu#)b7pdI)?+Uw_YuNtdXK&=QGJL7X`rbE*f#DX{gk>BGjtuA6 zJ~TS4;86JMXL2sOUggV~&c*Kh91IMQY9?a`L&K(g=8V%G29ocUvKW>a^}Z@rF}}KK zRj`J`k)M?pzHYx$wSMbY`MHZNx4pM7z2)@tFQ`s(JZ^IAd8FoMhAUg@qXUmDI=i2h zLFL`w{z|=_Uoy>S{8xB1FPJC6$f?VOLE*hF15Zy9*PYg$b@fMC*bNtEH};fH?>{x; z_YpVAKNj2!3vMxZ-e#z11vS`s4+tnQFyB#JPf3bJ#e+UXQbo{;v zYXL4$?A>!Kw@ZehVZ+=0=L(ZtJg{V9cwFqWnbn~^ z&Pw0{W5cdr>(dzxmPB8?r6|Kwx9F!iBZKWEhK7aOjXDA|#2M-r=rX>I{(k!Y&6lBD z85wTu`t9)KeOvQSc*D6(jG?2MLFF9F28n`$w^=5=n;fdC&|tHFPeNK(4&w~X2(!cQ znHWwyPHH zdm(dH^V*B$Eesncx>brTyzH}YdCP^q)D>KERWI%u=l#OA*f>{h^%#Y@4YchB+GhSNd^6Wk* zLqJ5>FK;G>D@;vQcWf$~c}jB*O>rxH_-JViW5eU$6JCooC^0q&GR^R@-OBOAsqs`y zC4cO}z3Tqld!KEQZOCGZslGn%!uPq+do4n`o%LH*y1(9)mt5$6JVq1CR30=ZQZ~6in)lGwM-Ea5%W0vGh>D_h03?H#M8(jTsF7+IFt& zXMlC~Lgg4XthIO+__BV(RHNRzSuV+E_G>ontp8qK|2*lRvVsCD!-o)t1yY)+Pj7BH z>m(;%{YO)rVM277gJyjf!z+dd+ivG|voc(dEuSl4nl(k^jIm=wLeAY?rQ4zy-53&1 z@dZ3ychdOLf#wg24Z;ix!Mkfh(^pui%>JKx`ufS*|G&&+#TUPhVwupp&s*>Si-5wb zXXkl)Y;Eh$CGFV1DlDKNjk%fkU(IR;hqe71O4I8<6kpz`nythllK4jv+Wux}c*w|* z0+W9$jTrOxeB={lsL)~v=ndgv;NZEcz}Rr-7Q?-Y$GuLb|E(A<$ayC? zTrap&a@n_0a(VJR=l63DzIlC<$@AEKlk=Nf*9x~W@|>9Zc8jE>rb0spGsCtMn^+SZ zzsCIB`Nh8f7#~MgIP*W5)%6Su@-m|nzF1fHvwdHfEVrKXx^-uY2s|bKl)U))YMf^B zxg-DeZv07SVCc+c&=z5+h-74to~$CUAcf%x8^ehg{ZgiZcWORQ5nxczSg?Qo7a8%p z_T~nEYu4=B-xn$1S)h;~@IYkm-o2NOZ2stP@IP*rPorV-u@qK@`nWST`n(Jm8e=vx zDEKwAGOT(Y!k*yu_l}v*PX7RjtjR143D4%V30zrq`;BXyxsl`RBE_;eqX?-g-@jhL=*a zIpsDl2=B>_^qtGlW0?D&%kce4-$gGymPhQ{>G|Q`za=w_SKqq9=<@f>tV`cH87}Or zyY+v6$=SG_m;BS_@9UGP3~964mQy-^&S}T%Q49=S3{H?{{!@MijrvQgCY`P4VffI+ z3L2)`_w#IiR}d3}(Z8H74u&4d;_VUJ3s(y=RNUQux`2VfbEe?Tp1<$qb}M!yJ$tb+ z?W|O?-~pE6`4#it{oMP$R{!j&x?7c7qiv6&))ua;>DYLl1&Ub%dQyCaxUI1R`2FBnejo^ zo6AfL(Si=_&F`=1HcVk;=&)gMxFpuF@84lnMh3k=)75r2-2Js*?h*3uUw(Igz?pfM z6`twmOaoQASASL7#h(xTbv^%<-XsQwvw^GsYTv&e%+2^}S^RmW2hShgl4XRp=0QVE zLfMQ{gcy3{Y(1SA{;#g7-&1@4a86&(-^ae%C!0AKl)jst@m}RQVHNE9Xu8 zmozZ1>}Cimt?m+HW_bPEzPQZ!!lM3O^V-^kcS44_znCQNOl^?AY+0(e{a3L4`kKD8 z`)BQ3RPMN7hIM@-#;AN&k*Ms{j33SN;8HWl%Ts{O6io)7~w- ze_hP1_Is}WbPXnkjz$&+$u0&f#)gT?>MgezJ|#c3<=~mHuW8NFDE=2>4N45n#nK1X zd}Z*t%k-$nR#c(pQK$NmR_=Q7rsv+rO}5ql{}=EfLWslQO}Tm4;rBQ0sB3t!FbLI~ z?=t&(@>{c-$HAGJt2mb%UXIz-&c~2(fB&qtPRC8sm>6=Ny`O1if5R8(8Hyd1b)=6?{!q0cgB`g_H(k?f0+NEFjvHMf*^99Fi-nB{R8EoU;k|W8% z(7?sGYxnMMy_g+YS63}!WVo7_5x;-w6@~*=+sf}h3|Q?cs`Ik?=T$>n=7x8U^Br$> z9kQ2ZW|()Fq2c`Hn7{9RCa_*8aH(Ih@_&g>^0IC9Dk<;*QXvM3ZyeH#6F#KA=>NLm zY&nNE!v&u`&)fe+@ZbKE#OQF%tU;;wXSflAOVsCh9tH)06eFKi7n34P1acX4fB)*e zuf2@TA?4rd_4~A>q@{2E=(hj&*q)EE!Tv|HJx84Js#p10;u$N&1(+Bl>*M(!?-7ry zI5;QNpmNm=o7A+Fsk55HPM_1oR_IG=kmyb4Ncy8WN zee2ALAD5o$9!+CN>DBq(ea5!-*Ondse!V{W{_nl_toc886h3ZB5O7F%usZ(lDvv;g z4Jix_&6_yw*cgIU7*<4X2-&9}b7o@QbTRWaLa}vNFR3-hI;rmSulpVmOy}g^fY%%wF>f zpJVmz*B1pWVP&W<^kQNV`7LKFX85bV@@jna`^eZ>+Y1Z_yerS&&}CS2|Nr0n)AN6> z2wa>p!@+@%LBV@k%hiO{i@s;Zy8BO9>bT#(FKsF|k6pvmCy zN{3CBAt2|)E8Z@P`n=o41{>G4JuH4F%E&M$iy`OjP2m}zGQaB!RXt}CW(WxW^EbOm z!FYbkzpFcCcE!ABgg3f)7z{)oUTXgSyr^p3%LxCwrFYUE>|#~Wly->N#?*0;g<;CI z^=m&=M@cXqIF-unRD1bq+_U6k_vUdh@M!<-WN0`f%J9Lno{7=DPlogF8*#ljq2vAY z#s2ckayIciXzRVLl(wpc;eeGKJA(w%6Ap$szS~mclo$;D%!{mFp0sbi`1cs$b^bN= zQDHeesSGc)|5!O(F=n~K!!TL#ywa}oUsm1nSZ%*Gbb%E+wDi|vV>t3v$lvIvCxZeb zi^N&3nQiKI^`)veTx9+j|F9(dql1B>i(1a4=umofRGx9`sV?>_W3C+fID0?WoLWVn{f} zbb--<&z0eF6N5Ix0;e|jzP%b%zvVa?8m_H%l&O7{TKI43{Lbz5_v@^684MU1Z-0&R z2|Ruw=BaT4OJCt!buU(i8!vB z-REG`ke%zJxxJ=-u~SaWieBwYm*?D{H!s!Xze$`IgM%dZ8v8$o?M1X$9thM49?-9S z>AlgFVe7{wx(u%N-^1f-{qI=5<=j~G)>w$CB-d8GYMZ^-Nrs9yE5nZ-R=+>_S^e?F z_Ts#=?@ga*%;2$gtK)mW4N0Zb1OA)cu<{SM5VOBwK>;hnvUTEje%3dIM*pzcbaDFr z= zA85#Cb9h$q=gDj#hJXn_>%U$N-+O4Id;HJx)d|1$Hr<>a&&jmm=XM4L{j-mg4zNjQ zzw$c}sZf=3b7OqlOPN^b>tf6dd3!$gF)&@Qy=`4pk=^^}kL}ia*AKtlj+?kW+ z+nc=@+Guig7Grpkx&8l#e&rz7OM6Qh7R)YWWoY?&dOqj-z4Ldlo;7t~kY>;j<+z~z zXE`flZtm)%o37SgS|Y%(KrD4nkX7oVn*uB!xoez^B@;fMOV zFFn(>UP$csHRRC%57QHBQnKR@F; zWch6mH8|N_FBWz`5zxqgw({=>CZqp~3=aMFRc{q%7xLL|V_;Z(^I4^F+8Kez$9lOR zWyk-X^|ki*Bk}zitPIUpSshpzzU)4t{hx=i{>F!5wFV}ZO-u|EuYYT8yjQoFiQ$*D zOMJd`^?V8Iyjf=y0=PAbR@uvbzVFVqfa?gNrqN>v2>u?*uwdP}=d27N91FJpzNGbi zHN%7CRKx#TEEjxcEKF{gF3u3J`c|;WMplQmd**w$zU~NMWSCw5Yt>Z-i2{ZX<^StH z%zdyk_x|?{CgE}4-x|G`aqPz*ZGLl6R)&z|_gULG8SYfQUaQD);N#TwHLf+^HqRH` z@_qi7uj}h=nHV0uV&q9-J8^_~ z?(h3pFpuHDWk!ahD*_j{-1_9t${1>FZ`S@V=$;Y#AEodZxsi_ikbISzU=QbVT0G5A`B077|dSmF{+<0 z&amOG{W3NO83vA-e@fl|=?Zlw4 zj_X&#HpUbNhtSJEKX2WVxpu*W<8@a{KR$Z=x;K}hzWnFQNz4pcUyn05G&3Z9oAXmK zIU_UnrA#Fg!#kz}vJ5{gg?JJe4wy3R;A^;5>*!n*XL2LnUrS_^hzh633J!|it# zi%Wdj5xVq~wc7EJ&-^fF^F}f(xXvJv!5|RKe1MZ7B7XZ928B(m4#q#`sUBi@aLLi^ zzg#;PgNE>dg>nrBsSE)-PBAdVC^XEuz9(<*k8b^1%`Zi}X4SJX=;qE=+Tg@L>+_}h z&R#c$2Yc&RE{SIFVQ^?Og98JsbuY@w;N$x16B|Qj7DLX@`lX-b>zEllYThO>Fx<6X$=1;Pli!iyQvN*~ zRcB@f`Q!e5-Qx2r4EUH_tk`tc?Tfx+U%F>U`lTBe%9?u=9L)bHem||v$wyUxGXF!ch8p4Eq@j`>(uOzWRtxtF?X@0$@TpA7AXu2 zlC?|>ceo}TbL*RUA?cIdi3tM&lR4x#jpH$ z(9D12eEq-TkAIsEhKDb+Hv8_%^K1X!uiJinILv?4UA|W3+?@K8VG9f;^dTkV!Rf&Vxv%b-F2yjR;%I!oMa0u0K4>ck++k;I_`Z31Yv$5;-qYXtj$K}s z8@-Li#VP)5ZgzGt8*k;;_UmVAav~TU-q`RmxHKsoIC9e1nL*+7d#3o~ZkGNG0X{z( z6j&HIWK{OL`Dc1PgF^Vv)mhGL|JQkLZni90Gw<iPSX@BKZhFZBNMojW?KR8Xj{&@I8ve~CqGw*MEzJP@xx-Y(w`Bi1T&yQj!hK7VgpY`K? zq66v+92gzu{Mj}uDKU0+&HCq8OuQc3KW}7{{IuiQsW5^1zCCQvuxPVka1eA@uGFyY z_$R69N)7kEe^=S}-tdE>FvE$1DOHwtwS(io?|HV{O^D%w{r+Y5#bp^pf-Cg>846x~ z*}QEQqtdbo3o~ywxSKMbv;CfQ>G{$eMu*(T^->qF+*16pcaaq1WVN$g+d{yD*|VIB zUrK>HC<+`>lNcCs8Q8b+E?{A3)o^A=$g!NB=ohG<*gaF9l_4W?qoE+fi}@c_7$yXZ zHB3*O?Qo>$w}3;=i&vqSf3^OKnaaV)aEj%_W{wn_-+xX!i!rRJFKGV|9dv4cd&;+P zo%&oJ22N1AU2JJGeO)6Y=`K*@Ww5xhVEQVyhPrxY298DsZiWv$YWKzBm>2|>8AyC| z`MjRF;eN~w#Ty@98#XW;@U}d!eK02d@T-I;z1N?!Ff{%CW?zz`!O(E#y1ac|)W4c5 zFBjBh&gQw#vAl2ddcM0n4d>?FWqgt_S-<}ElrP~Y6D$rr&(MoyhBiB$g&1yRF-+OS zu^^kbAwcjz{68OdhB&Ry{*K={#2I_mG6wXln6>xpAATl=4@E4jnd?0Fir=~TN8PEx zrst~w6GPms*FT@nvREFa!4P1w{#}>x?=0U2ZS6<;xuWU!Y7EayF?iloS3S)TU~OLi z;l4W?)1NpcX6Q1QRT2yf#9yA~W}5M9vGo;(j(^Ah&y}C0&=7rL>#RnDT+0)}3^NXe za(-p^+L#o>#Sjp}+puLOiz@@e<63qG293WTr97tf(Am=kiu?>;q!^YxN~m1_Z#9F$GB$@V_W$K; z6^tAicD1d$dZzi`U!Q1(Nhz;{=ef_`utb+#GyGO8Z^VZigcnJF;GfZ9>q`O#A)b8kzrB zRW7Q&{q6s4hK9UPD|IEdvlUC8=Vp@VnLM4DMdLe9!;#-93=GSzmM@oLh`hyc%wg)C zc=zZx7UeU})URV$@NRDC%--rahWZ0n|GXAxsJrL7RXf$t`Tm3Ue_ELyF$(k zPRTfxchHT;t3bqU#wXu_SF+5>m*tGB2OvVH6HoG7Bv8|ucK`xqM+Wvivc9SD@ zRO(krFeEfF>`L@!W|;JDsq_*NwhbAVXS>asIDP%)uB)+4QHu&04b5sy+@8mr37y22 z&Fx^xz;HVKU?zWs;j?(p|NLt?mNzoIGX3-O-D~?8v1o>G^K6uITp4^9im;i8G1~n5 zHFHtW_h1L<*IRe}y#9aLOMwI5e%qGba?1R5@=frCdc)qQTereG%55wR4<4A+iDaHj zWn{?V%GerrmhFS~5BApI+hBdpmI$mpR@qe|~rFoN%Sj z@qP>kIJ;E#-uGO1{{F7b@c~ah{1W44STaSI&rk5W(uNt|?VtTEdiP@iGsETkCag>n z^^6QJ=L*Jq@jyd-l?77-&vh@^|d6!G9QNZb(zr{UinMv)qnXMU}e*K__NoULz>GTH}f%UN@0Mv7*e?z zKJkbPAC_hE>CZjB?D#IjON?tq(+O z&WJqdJ9XB)4P0}U|I|OmP@Nek?)CTE_xkBV3^Q*1e>&;e{13K1l3H;x9~2l8>Q5Ei z+>`4s#_-@M1H*YEd$Z4rXGk%yeSR;=qyQ}!q~aJH%zte&h@H&BXyJNGkYPsHFW{x&DCi3}jFt@o??6m18omn$FaQVj9k&&B*{1*^dch65*e zEWg1%Z}~!fHU^8k#`z2hnoJQq3>wRt9iEg=sJ?SK`JKRmQmzM6{(BVGA2xm-U)01` zxbn|YrUnxMhpCHy_BTLh;#SOzF}yX$8|0(&a_;MCE%=mIr{}hhp)}K zi(WpucVx%*+=ZMBEC~sY-m4?-?)BD*x~JCMS1o6!_-#&wo`}gb6a7@j?Q2>eY?8Wb z6D70E=%Ont!=f_@2jtm-B;d~w=0xQ_VeSWgZ!;^^W<-9brWh;(7%n{iR{vaH@b39JQ;y9& z^M|>6`pE^!cmEWtob^tA*1dwoK7v7^^oEiBiyK>67c>XzU41=y2Uq@!hyzpqJ-u=0 z`|MPfxBs}FOE6e8@uq*C&%lsm%sy$C_=?=WS+B!8cbc9~d3ZQ^@p?ws+7kwbANIGZ zzspYh-?*>-l1}EM+j)}p`pG|UbQ+zw^Iq1{$N)4TUNi6c<*g$q!oDW;Dg{?t|OU zD%BV!9DDGblhKPs$f$KCufqQAdJG2wUTj*!$dJ4Lf3>Pf-f2wDxXOOA=G*jjB zyc@^*zwADqSJ1|>j=_PoSA<(^>xqrd=JB(y{Ych^E$rOMprCnnn$O2e%eEd|CB-Ux zIpU62UDQ&K#&0pbZc>^zIT;xYLY=oStzUh8iZ;W7w+u&_8j1|xEoEZ(5~n6vFU(Pp zSseM~z4I%Jk56WLXxVT5R=@c9_Xm@Iv&^pNlUiK-Z;prHf#>o2W~BU^TW6lk(D2pD zd!k?A`71xK@$gCAw<+U+trBKoIPm{r-Rrg6=kyq^UGcFl)5_25ss5!86?_Z_v;`R+ zTs?eYU)}9(47Km=W3B6>XV18>^}yl;W&7`)y?zUs8(xN44h|$7a?pzwgV;(7|%nlZoNW_Ka6sST`~>Fu`VEm>4u(d{pn_<`NIiiTHa?lxfEn zq0_UDPGDoWV!FmFi&LVq-uBC>|E!PYnHXN{$@3oCb}4`M=e7I)mI(weKQFws_w|V< zr*CX}-+AEAWyAiUz?a1yu=(_85#CIYrA&K|46A} zz-HDzZyAhazW-7Gmp5tWbp?kEyZPH08O(l8=}nQkep~L_-Cyfrb7A!Xl`pOTm#j6v z5E#ARCE&)B*=;Ah7G0BNzCx!<%PF^-se)p7vA?Eg%rFSR4Hx{eEwP{uG75!Y{wXb)9+N~dCwzcorBkxzB zclM9P;`;i~wHs1jevpx8LM#=!!PMZ?VYvNXUX7iRZ^iF8$CdlHeJQtcFYb!{c;(FD zi%xrDJLJV4{cf%Bw*1~^|1C*T?^kg#D}x$`Ln}}Exx5Km`DcaaOmIAIvMgj`{q#cj z*EPxv3C-)5|9ahD%5Wf>;m?)2jWtij3ctOH+*tRwDp`OhfWa|?`@qWQahqoD*in)f z{n1YU;Dc({6o!wn?-qaVM=?O1T@YWXtgUGV~Ir`sun^r2!hznS={(nKB zfWy!8|5rK9(L1u#Y0vA~f39<1e0E&3zUPs`+oT0y&(|?5Sh-Tuuxo1mKW7F9+iS** zKCAz!F&N|rR&O}9epan%#hm9qOPQLK8qV+krX2jgEOF%{yBQ1$r^OmJF*BsR*}0pg zKKxpE^X1pR0t%1MOPtx8ow$|f-_E?-fwDJOO=4lZ@{VEd`8Pu9broj8-TU`2Ff9GN z`m5y*ftB;$CdB@|&d}hI{SRJGb+ItSeB7T_H~A00`BI+aZ$$Z4H5YGV$d}Y$Vz7zm zxXx90u$|#Kci}pLXzsx14)?zsx$QLSE3UM&?PP37Qs!isVZ``|;lQE2vyXmRm1-n* zHJ^jwz#`Y~p4I<(7_R(ckg@;q()!TB7txpBCo?pxHk6%U`}b)Ob3^#gzkh#Bye})t zw1k1d@44ERknWGUSDSk5+v8;Vo0c*&%vxQ>k@3^9J>u`F=9#=T8{Z3dGBnJa8*IB? z^Ty-`Gx2&YX@(b>C%?#N{I@@U?bY|JuLY-AK5Xae&^gLD_5Ta|SL?t0KNA12{!;wY z=^m3L;i|Km6#!>_CiL5+J=@5Lj-A3bJh znEpsEGMj-XlOf@i*uv18=eZbcZf8e#G8_n-|M=c-u@|k@&GpB>`^*)W36^c(ue$Z* zZ{0ChxYFmIIsD9`OoB< zcQN;(8QLTnKFIX5OEHLW^BLtc2H0QrJQi>IO^?ALclC1HGFFCjw^d@cF|1ga%Wjaz zxL||L@gqug^^&*UpK&q#lD877;$va1So;6()$S)Z*7w`%*jd$EU7w`{?VCU0VX*tU z(qB~8lL55sb;*r*HwJ}fBaRgwacm3+R{l$QSN?1D@8eTH|9_Is@aD^No3M^R=S=Q~ zUC-m|Z8)MCJ~1#<<}-TSxgVFsaA5vx6@~?M??M?I>P-#VI2cm&m?W4P*SIoN%Ue%j zXYg2kXB)!{hK7CrUS;h6adqO}W9QYO%TGd87+$=)t^Q~4A6I6EU2Xr2{cLv`Gcfpl zjen5Nl=C6{xBb)OKK0oS*^1wOe0JwOD#c(kEreNN9cUS%sgVfdnPhH;gZ>{&S%v7;!Jk)iFTSi}Ft0^5Ht+jmj_m-%*q z`k;>gn+25rZv6VMvTOY`YleW^e_wuO_~OGL%TV(=f4^??nLl%8scl?P*4x6c=hXSt z|NqQ5SFanl$?uBUy2%U)Z+@IKl8e~mGsmiWp9aH(q&ufKG{p)sG~E7W$ne0dfrs(R zhvS#FF!mU4Sa`jo?tjSUHS60xmoa>`=?#3&fBC)X-`WNHg*7*6doeM5dG522sbPi= zL-aC_N7E$wV#vWgUnV1 z1!jh>Lg8gxO$?1c*WVXd$?xD;tmZdU^~N7#h7%bpx(z?Cdv;GX_r7VZ^=q+)Gmet_ zInTactr2CK(RBXkAHS5YnVY4Zem}CTh_{(pyVaS2wO7#O!+$xKTeaWb*gc3k-jy%#hC*V9cnoLXBZ|J>P!62AlJr zuj(>Lc5kTUTm854&f*)VzRzSl@bU3-l)*tcQ zALIZ0I1<26&yeZN&Y;B-aLmQ`GN+^+OUIeuZiZ<_z56;&aC@Y%F+9!qP;~2Bf>xdc zH$&deuYQJq|J`(Bn6OkfQIqk&RI~ce$&3fS?fbXned1|9c#Bs{nqfmlYOwyUrT^7$ zuRozX?YHfbVk7JS#ftyb|G)kp*71ME9Oc9RBjp+DFYL6JI>)de?`mP-_M5wfS|3|5 zZ1{a6v+&&^{w}j=oNflEZ9kpyI3cs@-cMKmRT{+%0tamLcupj5zhfNPBVl;xv4rif zZ4V3`8MGK)h_i>@-<%ZoYx0?WUu*p~i#9j?Hw!Ftmz${uEyO}LGBhYU#2#K1V6{Q< ziOekP8TD!Ex(pj)=NmJ0965Av>!w3he}8j3J0_R(J@>u6-|0+s(d3BQjOiC{pYz?B zK5a()Zl^x+o_dXpo^u!Hcu4Pd_vh$Jy4P=Wf3?lx{rlr{?(PcRvSrH>u3c^G)|N0h z81!c`1tcDj4E=nx#rmDv;`0wR6}KdRJg}!V>FO`N!k1s=>!+JCJXkByofUp+{^VE8 z7tEG%i|Z@GhNhSpJeU|%_8Kh6`*-=>SAA0!i42B>UF~Q8n13n#;I#_Wn4e`_m_3(; z;q>=>-YDZ$3=LtaKkd{Q9G?HVmRohd>f-kci(U8fKjmVu`}@*gT-1=^z-MRkzY9MW z8T}L4U;T!yUUFG+*T?H;L8~|0`D9P6e&@XGwWQaimCtk7xXk{Dl$?2N(*8{A=zp(Y z+gYLGqFQ_mH?;ooi%RxXpGbMa$nay1mfym($A0VYzj?1eZQ-7E2W5o5Prm*=Dfpo4 ztj(qWGZ${loILf``X0`Dza-Iec4jHV#6Ho#dxN%ozFZ&YE;(!F_aL`|TqcGOkB)sZ z`nZ%uXV%AZ!~cRD0ZoVc&s~3Yd(xGF%m1z}*tvG~?xIF$pHLv=BZEULL&($lJ}RwI zAL}(vCfpKcY&dOs*)}4pmqnCei~SzgfEf%7tl!(rx5hmA9icSIG~wlAIYTo~*RM$o z4cWWO^B4})Z<;kS}gbh8Jz|=Y2M9Wnw|}EIAlrKA(RyD|?;f z1Px<`2TK_lmRT;V_Fc1X+f1%ZFFCs^BZCb6y;Ytzb+6W32zzUPj_Ji6HL+`3*|g_> z^}d~Qp?-&^tevJ+b^k4&Ws?)lXWZ7&{r`!LAh*sWHhFm~9GG_P{Pp^KmW3;;{4eg=rG4(rYE#B1A9u~2 z?sELy^jO{*7ynG>U=WG^aX#x+X(|f?^Dfo{0SEN^_kMk4)}YAAP!a$C+0@*H_l1rA z{ol9Ujm?>XZ`SGS6IW;~$ouwwrj>siA47&7tl1#KpfTf9W7j4I1~KDTmJAH~j0`Ln zzaEi`HQcv0>dv;sw-yInp7=Pb_vcK8gEj9242qrvO0N33eQm%j1%`5tjJJDr!g8vQ zA8o00WoTIA%5b@_+p_rC5hjM&K}-#d`b-fl3?65UG|IRgW?3<4`qV4kP%zcY=AZn? zL0e%HLxV2!f$rOC3C62;pO;tsEYHBO>dXHFx3pVNZ~OLU<78b&@%r-*j z%fM&*HSpQq|Mimb&aY#n844Jf57x3VFz{SeYS5d@5R}hoQSu_-)tQz(ano=83Ke2_ z;rj2!m(3rqpTBHc^7hEdtrL}+Oh3A;x-#No)cPQ+%ZlJU-sveeBq= zEdmNNyj@u?r${e3A?NvL%><3!`Qh)cuKHhfmglcc?Bxx=X3U8EzC^-a@s?QtZ|R(8 zmrPmCX+X0k2g8CQhK6t!1`f$-wf*uN#TZi_uZu5!^<{HY)VHOYOc`8D4Hj(VcyM$2 z{VwCFaWk13>O&+M)^#y6Sk|5U#K5rfaDe-PX{-u7ZTBPo=sSBKk6}D;Y1!6IYz_CX z85z93a%<8;aoN?+cd)9>{xOqxJqPcynGCaQe2RZs!P*ZT3=5317?!MKPGDq^7yoQs zd+Qckfa&`!vJKfx0p$#-PcPkIyI}e#ie+BKGtuQ!zt)Rn-kI6Wz$e1saZyl#i6N%@ zwq=vrdDGl|Qy3HywHpK(cKo@gGFSgusp7__NgX83=9)R8E!m_-BF==Zb5b7#Z9Y> z4PL)C&#&kA;dz@JwtC9(uZHX6e-+L)Ii>X=G@#4by)XTp;d}-LuTYkP2u6n4KF7j( zb&OJ&B$S_}Yq2qKcz^3PR6hQ-)W9|QxxX?)gE7mAAD<~y-xZQww0#u ze{r)`A@ucr5lM!l*BCsC_fNXU;BmRHKmfGMF))%LbIPZ^8?R0B;AZF&mHx4;_qp@> zhfTly7CJFlEi?SOb!j%z<~BtphAzXnqhHL-Jy{vK0@ki+tS>L zxy*O2&pBTCe^b~Aos<$04u$t`Kix_(ZK^ukxMXK!)y?UfxDULzxHvd}qQ=&e&+Eh2 z=o>RAOp05sBgydV^&C}gCw9##v5OCzsyCz)EWiKuUowjQ?KIy$JYp{9EvEvZq={r7>44K&sH`aY-bXc*jjh}%95l;qN z7#oTYnx0)Ft=#=1DofB}-`XgVp8cR@t^2F$Pu#hfReyPE{Vax}p375z7JhBo`{-Wv zcj?Q2ccx0oZoawi%dh^qJoe!epZ_>AH+s$0XPZx%1}o^D*dWfy=ycuw=ab2vxk|yc zeMKh!|JX_0PoMqKw0HaZ*JV=P*>%PYn|)dZeWR6DxGuP_W>A*RVteo7i^7jbUgw{B zap%7W1H-MVZ)}fE*q_PQLs}tB3=&QZ2bNxly~pri>GZfw#~!-(b=|A|?Q;BF+{T9q z>m%xygqz5}68c;f?fUoFR>9`uwP$K4=ddu8^o9R6E!HsRkgNK!qT<(^%8##>$}hde zwUD`C&282g#s=>j`|9Hu4kY;rTgy$6U^sD}F}3N3f`*VCi-AGjQyz!s$g}pZ({C-%NWBI4$m&FWYfoL0OQN+N&(BQ}hKB?hSv!-suO?{p7 zOHKcKUflj$G5MC=){n}QukU@o=7RRL%Mx=xKX(ah^PgL77dmm9NbQr$TexH<+}Kr` ztrx4DWTzh&#_(wGhJ*DId<+in|0OgtEX?Cy^)WVZ#(Giyo*eZH$A22eM&~gcU~!+s zz_4Fz)=z#$hPQ*-b6x(D^Xho4-KEVa0J*_VvFefW#g?G=tG4WYyH-}^Oxpd= z%3@4UI2kx13{NCExWu3QQGIv&Y0yIFX1%T=q3!#ZJU_ZXNn^p!y3IUojIXY7?n*n{ z$DDb_-iQ$va}5t!7;dyoR{V4>{Pcq4`!m#;8dN^7cdTc)xH-3c#W99lONAQ&`?vUR zS@&8jOSJy%57oCb{i6c$M!sDWZ2U(UsInUAVkpN^s4=DZ+!bH{L5<_C({v8#*k?L zRr8aBtsPA#A6RwXohF|7Zy`X)pDp1F#PKf-qlGBC6W zGfa4U(CixrS8&%>UWOHF_IykR3^z7xjPIF$K}zD^MCE?Bu)4_#4Yy<$WS{3=%D@n* z;1ITSrTv4c0t_ix%rlf3IGTcgUj1ipRug&^eviF$W z_PWy4_UrY6S#_rMKfZ6BF|{61(OLb?f`Z z^kqwPC;yrAJuGkL znq^V&W5%Agb)oNX%bXsw#bwOZv3m9&eb~ zc;d+hCWg9ux5_yFeplXNyXgCe$FP|O0R{(EriSx1|Mox2dlS2O=T_ZfHisa=0}>nw zx=cR~9ldUx%8=1^o>hUzMZ94W69bplvh9_(E%v!qJYT*3h;;S3JMZuJojAUJ z-bB~$^-p4Ux$W;~WU$!EC}Wt^VtA}~w!*Ue_P2LkpMUP6%QLZJ$|!1$-QgV%fS6xbPYD#{w51R;?kB#BMQ;|o%UgwJ}cJCJzR==lvtao>C+v~@>-_O%ZJ3ntOD?>`=;~76@DjD0q zzpG~UE#zzbl|6SwDrGZ$<{rL2q4WOtXPeD96gGU~hb+NiWME*hU~bU7oaSo9Xwfof zf9mUX9s?V7n5Fc#y?Rbm5Itv4bT7YlE z8ZB0a9na?H@$}fv{JEuHl3_{3`q*vFDNSCR>#u0^?)iUpbyaESj{N&fg@<_`H(P?v z0O@a6`#l(&5Paj^yyR?fLvU$?KnFQmC<`SQ=N)$W_DbDFMe zyZ6xzXW2(jk6-WTR=@7mQSjhH;oQZeJ9FHHDdo|@YyM{&bfr!Nm3;gDX zo2KWTtYd_L*m1()qb-`})_A{W=+Z zXP0Kbhze$Ny#Ae^8Mf*NzGpxJ0fJs6snL%N52G{iy*;{#^Qsxs6F4UE=F?dy5hZoPQ`d`z^$k6ZfdRM~V zn_qGnavuHsb^33pk&lCe>7SZ;&!-D9)ZaK{{%f0tC4&d^oUkorEHlOaM16kkv20#b ze7UwN4HzIj}{cTetD9Qd#p23Q@=%*Ws*8Od7_*S0r^;Q)g~y*9^*gEOq( zF7)3Wnqc5lEA^7W!Eo9+hK6;C!RNmxe$J12X}ePP)hK7g_OPCs-O_ff4?OnC^#D~vW`*yK9*t!?Llv?|^xn}O{sCsLc>G2;X zGJqEMd#yw*c~u!27WI^$%4uBkTV*X%^|sHJObs4_4$>?eL>cew+GTa+prh$`-PKl4 z_nPU*9WzGcx=-b=>>i?rF#D)eEwPddUog(ha)IUHS;kX>z99jOHcp$)bAn!2cF7h zGB~{0=y}U4UnQha`hYBN_t90eSOq`lbG_qRaBSLHX{WY%##|@P*jE*_&)K|Zt8$V4 zIhG5rK@HevzWYLL?%9NH*qMHLeLiEram_yc8JfSIovZI)XxOtY+oDdaHaWgo)(o4r1zXgt5B)6Kwe>;3;n&Zm!d zGS6POWM-ItluGkv#tiF*s6XpP7!nRM3!nJo&d?C|!=Ig@RbajDx-R2)mDf5x@XVB( z_jd2H@2k`PeR}X$!alKW$IoY)MlWU@&+Pj*4_aCV+|1Z;)`H={gvqNzr0TbRUETEe z$*X;}ybLbKI2l${fBX9SG$+HFd6m0a7~Zd+uN=~x&%_|}FGkYv*xhgQq~)y}SoHb0 zUOf7q{^$w&l9&6RUaL;MVA!jAwGeiWnxnW80|SE*6KMayOoj$#mJdN9oL`LYsEaXN z$g*jT>*zlodUnoT0Wam}AL@-6cc?j>cyL)_`J~rt|2^8qu;SotMz$pG1I)ttV)pUI zvw8O}cV@Wz=eMHWi>d`n7!G{0EYjndk*>=Dueul*R(LQx$at`MTVe4ocQ%KIJPaB6 z=B;rN{l`On=Wa9Dbjp9(ylu<@z6@GCC(`CM9|IMvsgf@k4g}n(_m`?a#quDBVZTAb z$!>3vv^A%UBL0d&01!IDb7y*EyCGOYM}_vDt#S$1pJ zt=9b&BD}Bme(`D*%=@04c&aCeYU*7s+Y@mY$#q@QF7Yq;?2FzU*6a$ z{QAYuev?~&Z&juNW5e_idFaBqCQu$=V7N4M{g!390oxc>9Q`Z7FkxZ-F9{}>CPs$% zwOp>J*e=6!B|_eM{C7^YAkoyo`$kj9|E$CP67|ELIK$=y>4ObokTZgXr1 zxM;U)+qQk7v+8g0IhZo8FiRWsK9zDTNEdn$$)06+AouNN zm#cGjF4SSG+`s$%WX-=dershNl1uuYz1Yh6<@bf+`VHmlO@o`xeSE!Y{%IzLM^hN; z*D1{TeRus^h6j&}8=zAX7cQ_eh;lG8FckHCe0==*rj9~}hGzj;`*|5ISe~wZQr5u8#2`Qa_t)q{zpwT$F3xzfeZNB)w2N$F z;<{{|kW;7-!wKs)ZU&Fr|MXi|mit~WGyPFmd`gVr&C0#XW+7+yd~fv7WxVXQU(?6I z;cd!-Ss!w%`RY&2Z$4u;yPi*;i=)0T^QwK3e4X!>&)0qnOi{3yuzZffq4WN+ou_y2 z4Y)AFn~f1M6vV(_z+=SV(xueUd3~A5|8oGX|-??S#4+Uli+v5xeQvT$A-v?42M$aOme1cdr~F&Y&~WTg zwtGrb5^|*^lFiUzvztNXZ12wfr_CC#u$>EIxgf&B_(iF~ia{ZHfAYbKpI;L`m;8FQ z@?n3gLc_nk8P*I}Sr&ZQ&L-hJcYESNrJu$t&UYs}hp)d7{$g^E_1Xuo?Uz5b+h%aD zz5boyg->VqTOvmF7#JE7Sr|U8+aqUrysh;1x4#pM)BW}-{;G}_$_}^DxfS;P6nOaI z*Pq45=ZP%$v!A_l(jKX0W)0tc<0T?{pRZxa5?ry3aSJ0u*E`GPr9bOm9b6W$Lf`-k zLxwej#H%36;*q`O zYglED+Q}FBF~8>USfx4VN{1`+b0i4a+S>~&urO5EczUhcf8C^RO8xP8%@B@+Rjdi7 z8;;+a+Z1Y@8>ZpyplPJBxHPtWP2%#m3^H%$-ac|@*ENoYjGQ?2=dX$wnSRA+@pvRG z%|5LM>cal|bLU_~b+rSc$IZZykipE*y)gc{dmh7sb)B1?SHF5S@00J=>8UTO&*naU zCHFmufuTv*Zb3cA+r;M|w=g&u{`r-x&hP-V#p*)Uf1Znxrm-tZnQ~b9c#qwE%*U8@ z(b-n|PznF-yCDIwz_mBdp?|;nTxpMbh6IBj^HiNaZ#%!s{~Bw+Z8j}e zK4C_Nv!T{3E8a&(F(hcocwE1BCSET-eQRu@&%%R~92k!CG2DP1tjEX@BE|6IjQBo} zXZ1Un8}^&YigPpMNmS16ssC|YP>yxBr`b;tEr|umUt`!91a>c~E@nLZA|Etf$P{C=qgn=QS z{o&`TwJgFc@M#+bhK5Cq3@6S1Get8PU1!)J^{)QsJKdCj%nS|}3+{I+Tq(RQBg+u5 z(V=}>{V_du9tI5wh6#=8#rL;9XMKII)T-XS*ymY1J3|c11Vx7Sl^hG088~LwPGe=7 z@>{H7<>f=IVlPcEK7S?9ki`Ta%@AO4xX7>|VL}Ll!Gn*#>pyS?o@7WkQm%e7A=$p} z%drVR)0J1GaePRgw>*t0Akm>~4MW1EH`gT@DnwX6%e5Tb(&jXGwF?JBfwV&#Lw(kd zE2@m@>Gw8Z7V@bYP#5z`ON=(q6TwGDjAs3ucU5lk0w6p5Ik|uhMht`K{{OH4DEwdZgK{$~!zC?Uh9CDzi;ujJ7UMMfC$ndjf1AH;*mm|6 z0uFbD9PTn+Gq;_~!eArKFvH;MqMjfI23gQ@64ia@tQaFTP-0a$q z)rr~6J5nO8rN13{@Q$G{mqGmMIvy@vBZh!%h7ZY13}0q&F$a}1Os@aAzvkzrKfk); z|2WnBc-TJiJag|w%hGk)KTZWXGeJhOn;00{7#KFN&aAfI)3oyY4{gbst|gxfzyCY+ zzk2PD$@YI^j(q2x@^Sfl-}8wE3=LWTcs2hmyv4x6XvD2)=`0N1v#+t0a-YZuKf6l2>eoKawe!zdHuvRL^PTGY z!}q<@x=pzsLT{iru@s_@4|)aPu-~JiEui;PZSkLxWWPubcYQWEd`d zzpy`lCFsyP2j8F9j(>Sz`Kr?E|NZTcOD>(-zqP*le&74a^*{L;8vgBlo zy=nh!qrQIM%xELZ^a8fL7TmyKV`ivm7MaP=@Ned2Ui;payPjDuR&r(VT^1dm8h-wz zD}(?1s)O}x@_T0VF&x}E`}mhO1_sHqDxcRoGq5p)NK8m_U}$g_JTP;!G*k21w*5`| zj19LG8=8()w8pKz^Zw?$!we40EZ2Td=v@AmVVP3HukRPQn5DWIUP&^@O!@SF`CspR+o83NAiH9T7XX-f6c@Adz_Ub~^oP$;lKh@qi-6B7fM zG(*8jn~r9N$Ld?SN}t}m`e*g|sk~aH>PA9XJV|+Oh8%$fG7JZvuis_$q}_${6>rVo?EjN? zupXF}mVcXR!off7eW9Ntbr=+iZ~eaD`S^W`;Z_C{28Eb2_N|(>^AB>0vOOu*VpyFETXSGK6361aSomp9YL2GVibr}BNrpLg* z45|4qY+z=%XTZ)dFYm+GDfP?@AKI80E_4Y@V_~Ry_&I*N7~_-UyAD2k)UZvdp^xFf zwM)9?3<<_7j*2mxI5gZ)c*!=qXG^@WL*3Gi=T^N04GVy_aaZuMir!m%_4_*QXVLf1 z>)$fZo2pyS^i_}3#O=8RL&o#w>nFd+Xcjx1))O%OyxyTRNQ04~0ybcGp@4;9;@+!= zc^E3PR z)tf>L3mdk1^{mHLzApYOc?M=E2JPaWm30{oTf1mwZneykVF2i}7ud^NZc#O;WEnn89#h!*hGHzyI4NCO1hjeD|BH7PF1)vWP?B{pfSUDAB;yN=+jtSG!VQ{EF@@DxPCV^;S1_lLbh6j6JMlv2an_QI&F6$FE z&pr0%vT5mTTgkP1r?a*)G1!!zujgTzpcbdg^CJAfbz`}vT^y%uQ)fIo#?Ua~X8KKq zhJ~^58d29vmoqWSq`c6N-}ffxUuB*Q!-Y+vUvgLw1-?S+ul=XDHFVXpF^J^*Z)Rr5 zzq?;;=Kn-qhLGl0bJtIsxS=U`j{D2IB9V*-zV9oaaHgJvVTTh#sXzFX{9o(hK}Bt~ zC_})85{3h*Hd6 z6gvqxn15P+K1SsCul`8J1NEEr_vqZK`<;vAw4<;7Z(wD}`Ec@2@C+j+4GsnamX4Dw z3=A4V3=>wqw%=iI%<$oCJp;qLbw5{%PcO^Y%5cAKz_23j^TGuhtPCe6&78o(kW<9S z;AQ5d#9*+M(WdZM%!xnho~;aO3=YrcKfdr#UHP_p+`b>PO#au)z_OnJg98&o!3mxd ztV~m+84`le$A>Z`Wc@$R(D3|4al17`f^g-|{a$UH94p%9pZ{EAR_ZT*TTSB=6GK)+ z*zV?l=RzzCKn=nL9k-blv~7}A*u<*v{!z;nr44f!4!lgCpKkpA&9=We4K54;9Q{rE z%MX4i1~td(!NZjd4C`M0*UVxLVPX*YwW@9-gTqYwHMe3{0{`qSET_#%J#!&OF zcX@bMxBB&Eh6Spu46Op+_4efGGG%bJF;od2m^t~~X#z@^U3f2JyJvDiTb4KAbulVB4^UffJSq>Q`kjJlMdiFv-y1iZO#13xf?qL+3#) zBWY7xV+Yd%S}Yz642QO+E@fhHa%^S%`;Ot*g5tW54u)xWBn=Z^xjH_ZfA|Vp!O_^o zH^01Q{gcw|u$A}0s+Yn?4q25=rTNbts!@NUtqwLRU8S^4mE6%x94YAAoln6 z=Jy^OeywK*9inSd{BN>gx>CJ+kAxtXEYpf*=Qgk&@D5&mDCOTu0|n-W&dJ$JXWqTF zS^d+^`x`!Pk*NK=n2}+I$?vZW3^QB=4xDG&O3|@v+Ml+hi~tn@bh}Mk^yY#lmbITPIZ#pUN2^bWl{`< zxr|pGcpEAh7R;```{%YoL)H^M8M_ISFQkjtH#0D_bpKo)achg2!A;)YY?rHRsut!m z8szdSEI$AK>NZ>U)YESJ&R<@B{uwXBl8f_=)BOZ^y02{HVEMqv5cUspK$QYRgVJK5 zEC!WUUFHKzSwTnn?-5lv_h+@hfdFxbSr+UJ0@2(GtPB?K+_RWHZZlpv)R1-1-fDT* zrTYKg8(AIhS#vQaHHSp+_ex_}@s`7v!NFRev0>K6gU>VnbWUDg#Llql;&w&`RwfZ% z1_s1r_bDa@L5>M#%nIlJFf-J|@ECA1tT_5Vh>2lhGMhu%=jCE-Caqdp3=v&Q4U7pM ziT|E{o_SZ{*_qs)HJ^UZWVpt|VDzkBdRJ9z+>653=juK#xzDzN$CzP{$x#)kw=zyJ zHyrFMI>+D<&CDRlkjlsq^4Ls6k|C4fz~11r=}UMM!hGj$yKsYT!Zv0NQ${6*gu>eF z6LVIdfBy1MHbX_ZU$qn4b;bpc+kD@%|Nj4S#vw)q3wh}1p#Z}H0ak|kZCC&A*~M^U z6T=491u4-Cd*(1UTrSP(uiP8{_p^SCkp8|u%pVWS|8?2(@!0H%^S+4uT4go+xyiG5 z^E)DusZmeA`|j1@$zW#qw~bMm!Qx>$!=B&ocKZo5Jo{1H%dlY8Gtd!AtGE620A)>R z&SYR?= zV9wC~HJytgMUyGr=zoge?(O!+1sZ-|>Yn`k-qf}$tPCsccLzO;Z;Q+DpX+^Wwh}*s z!)?YDY7C-mOWrZ)F)XP4JB@)spd*1}fmGG>fV2C5S#AC~-}JwOinK%g*Z9l7n;Dos zd^KcH*x1Jc4h?~N7Dk2;35E;Ze^)Xb2w|DP*s#_Dlziv>S|2_o{jk^XznVWb&bs6m zU#WdS+JC)>xc|Cd@1Om#du2Ts46-jizO-ap`8-~R1E2$~+)9pKGf!r0(A?q7(4NWH z%wTk1T)umaPjJ+)Q}g7f zi!gl9+Oulc*|;1Y)|*DU8fs^2v=|t=um9KC^y)nW!y_xiK4k_5Q7#4{V`ibSpI;Z% z*WX}zARQ9-GW_@P*$fQxuNyP>*x~__7!)QYZD2ewzwTRiBfnN*$N%T~`;~pP z{}ryj`^(03>)$t%*^ji_*E?IR`Llf8v-OgP>&;}<85yqDY+G|v`Xs}Pd*9C-7kydF zA&~xWrE5aF>L?xw7LLDnymrjfXJ=r5Eed92;E`ug(7F1zU4&u5`?XaIgJ#xGns+OX zhry!u(S(Zcy~|TYm>In|8O%z)wpCp%?zTF|5ODiT?(JfOl3c@p!{0s&GAxiVe#hg; zkooIp#;L@P_O^BGsuZyrGCxBRSBxQi&OVje1B;=ug83zo|y{EiOU+&J&CWB z8d9vTmwxFud;1$pTgZ8agwMXkRo`W~CLhcdt(Q<>P}pA{oZTL=X@_G>_1mqWHhxKf z(DJXcw^I%}Z{5a{-hIK+o#DZrUKT_zUyxx(*^w0t3_knok4<1@n7{wkt4Yia`+t5i zU;6WXgxZe%om;N;A5Czd2Ojf!}# z|8iEFb8OPP$$@U0<(Hd(zjm^sHoG^?UC^OHMIpgH-iTp>Yun%dje<+R)Zb%rIQaM# zS2+{IhMBd?mD-sZ88ko*DU0HNu0KBq%w-m4Sa9R^9;aEQ@3&>|X?pnm-Ja~C54$dc z4)dPnT>R5Y==@?U_S4hW3vd0p+U51Eb(5{~HR@ljTHSN(kNw~H`TCX&ANH58x%XnO z|1*0A21b^E!)gD{J}+f>uryXx-<09O)Ow@;a~K^M9By+>U}LbDznPIimg&N0oiy$P z{PFw@4grrFZpq}``ka%ZC#v|MWNd zlg5$2#ITJiZ`Am)Z*{l7kQto|D>{1?N*u;S{%b&|%fQ|gy9u`zhfs#m#U37XPoY*^5%BK~J{ z%kn(l3ych5f1$N2c*2#J;l+<%uh)w&Wn%cZx0sRP*jt8WqW>Q;HWd1aJ$}!`a3!Qf zmLVgpd;y~a1Ea;CcMPC1C78J(*8QF^|NI(%jjz1_>c8EyIkD=s)$h2eUZ*_&dDg40 z?3%2#H0a-{K$+)TgMS8{dwrsA?u}{cme*_)8XcGnJ3P;nI6E7gm@G(}_q;O8t`{k%Vf4#Nz`o~?r-_@S8D}QzS%jb}_yV7qwzq4}p z!=G=rUVD~1YyVSs)?{`6x%mtYnNBMh7~ap9tS^|&Y50bTp<@2}huOId6H?w>c5ne zRdGDw*~4e}pZWFtZpH&wrv5iKJGm}fYa^G#+7*e1beI{wyxE`o?QOEnwEFcAvvnB) zrl~bF-c%BVPY`{Mzx{R7TsDRe|I+O~&)icu)#!g;TLbGX+v+mMk^lyQrFX44847rI zJh#`V`n_(?gXDc58zXsEYRg<%X+hYK{r8)I%n&83L+TZVGH&{EUIYeW`DK)Q+C|Fou8&!VCT~IEWP8 zPnyN9c2_x}&7SKecR=^4nf1bt)z2#C{)FG_$=mqL&N^W z|1&>S{xe5-XMU2`I;Y3?-zhxEVq*AqX1_R-$bFU#5eyURZ`o|%Vo>19Vep8YW`4$M zpAbXBjSjWXC)(!w?wY$z-}qNmju68GpN2cNpH6Z7keJW?$65@2Ql0>)t-#9Akp1j_ z9Giiv@Pa5w29Ybw3yw(sVPSB1%EWLqCYW>M%=Oa7bC3DYaMj&BZDvW`+*{|5|B&hT zH2SAhT3eseY8lSP&>+MB8D`{oX20YzxCtV}P;l+Px@`V@Ifj+jm!}B1WG-brn#R9m z=1(1O_Fe1NKe|8hh!GnjOU&`}ynna7x#e&DP2OyM;puJedwdyw&e7j}kTC{6FQ)O- z{_WN+Wo8Tx?AnY4l6CigHVHLs_YWzq7iI7=dMC@n;IeQg?^ZSj3l@eK=l>qK7h96^ zJF6=1agOkwv&Sc$v4;m`>Tmz*fb=3zfwab#A@=!ag#)kIJC&2S|4CwSNOC?<#N4nZ zkcFXRQ^Q29zq+2WMd$rKZ=cThB*XY$;%SO8rgpfKbAtwsh022(DE zZThhe{cDQOKQQ}SlPBYOykw5eu67G84u+;_549J~yOX`En}y-rnx=-EZ?6=GzGIwF z|Kq!pF8hr1SCzlp-rt)hQDp-U3`Pb9P?Pw~?41W@AByE+NcjBi#^e5QE(R9;gW;SE z0yi>@y|SK7U$`+bsjOM-`h)!3yUx|$Qre1($>cv0d(oEo>Dp*?ZTfw2>XaA|IruNyfwUSn+(peb- zul)|;V%T!#W}d=}X~@u&;UjrN{2)TmSq$@n!pg@3!wU-=!~#U{KIzk-5EZ z*NY-GX#Q#Xxt^DUfgymI;Xta!Z=GC|hqE4DpUJT9O1-$kjPK2+M*^4p?APL9&{%pg zZc*X+jDLH3S(wAjPp~k!^;n;I7Jta0p)~s3g+rqHZU1-|1{lAUs;_^xkvBw-;ey!A z-?p&M2)Hl8z`)4xpwaZ$pW_S-&ddLCvwT?l`CRgve+(v{?@t%c{&$<1VacrbJtW{=fE_{VFvEk0u7mo|?7O7+UnUaxg#_C4o{Q1A|H`!f9$m!L;t?YEfJsRZ{1w?>U`14)j~^57<`Q1gN#3ah@HXfk9APDFT>&~ zMZ8}aq1h$jU$zJn1H+bN70JE4_3YoL$THZJ{%rM{^?$1?Td!|wm@CFm^UQeuN$K#+&F_Pf zlNXnZ)t={eKOM*P;SKw8=UwlnC$lyLg$Zkvsy1mX{k>n@PUzwZme7NL!avzxo-4#q^Y8Qg^U}pUbvZHAzQ0rav{ue@*{SV33)mRGRW>rN zOJ!Kg)8JL|w_m7Ey=yP~QpN@rjtReN=H2|Wh_Qj6WlD1Ao-I1P0t^qL3=i>LzoEPP zTd=0RJiK|%z;Iz5gTk*L&1)oB3TD<<`f)Q@T)tk)&mb#R&$NS~@${2I{s!a!b#@{Q zQ%?U8FW$e1!QomQ6KCfCz=;o88J-#)&s;5}!pIPQf{RgTogov`wVWG)XYO0VhgP5M zZ&Pqs&dy-QqG8Uk;p~21hG*yIzMdQDYgF)!XTRUy@+{V!u?kkt@ga94zhVT$H@ z4u%gl(<|++av0>F*!cLonv}&|X@~aQdnH`oS6)uwa% z+Z}Nwod?o#a10k_$lxzs($?U1fA7n%st*evUitE2&Zf09=Ls@Q$Yc7^|Nlq-lj^lo z85pdJ&gX6^c^Q<>c3|4t>OBkxQh!WVXjoDZU-5UX*R20VX#z2884@zi{m?&=8!p4} zq-Vd&l0^(c^*fFgTgz;NKR{vMvs&;`{8|HP{bEKp)-@ZGQfch_D9hWzS##i0xg z@;?sS|8XvU^y1=TKL&&Rf3G$%H6*3y8<)J*4`*}SdCbj}gW=s7$^Q#?zU`X*B=37! zx#aJR6CbLwW^FV0_w!M%U0VO+?4NRq_59GLKSw>of@6#aO5=Zqf4=eb-fxYy))vSA zznMEhLh*Y>I)?)n!GGhxx7Y<{UB?E=b5fPG$Z%@w;X70->j> zqHP?md(QF4vbV{=rORJ(mJ zlfS%FxrR6Xbp7`epEg5_8b^cwrW}kn0{CQtmZv{m&Bw5ckum4^a6sbU$==H2XTDpMD(TkdWJmUviZVI`$v3X~%eqL4jiG+J@jvsY+q9V&Ojs%^ zzA??ZX4L;hsD4-HlD&84-?eU9|Fl}<_g~oHUp<3^H8VqXS>?S&TSYSNoMvTM^i7NN z1;?YR?4Nm3$F{#PVwh!NK86K3YB#UnIiL68x>0qdBO8Og+w7|2ZSmXQ?q{u8yD$7fIv=bQ zk2QU^KaJ7hMg5N2?3ULv?SJ3tl(Y4Dk!xN5rf{F?%Nm6PW+$bizR%E5^*)fk>#~AF z^*%mvh6g7Y8=BtsFep5EzEfw}zK;7Vvltpy++tARWSX)_h2g^X`yG4k7ykU4y!ia@ zKPL*)4&lS^cM2(^T zLAC6{gEyJycnbWos;GbRVkN62gA|*^K7Fe%KPE4g_|?b9(AC6ncUS3ZE`}8?lNcP{ z+c|U99Y6Zybk6>J<+7XW>d&4Mk+jQpfVXk?izzr{upQvNzxQm5obvIShf>lEj4=!c zo!{tGY z2R5aiezb#&(IKPLxn|wMg%7is87>}|WZ=K~SD9F<4u7#I|w zr4|cAKr@5G>`x}a>-*Csv+ez*7&MO6sGr#(&dc!S^@KPEO<&&6=L$I;U%cLMu)cNP z&*^pCR>BVVm&+P682y!*wz|#UIoRs?-e+fLmzy#)H0d-P{kqYdGTau5@XM;^}FfgnuV|Xy@X8Fv&TY?&u7#yZa z{_rt=C&|d5I^(~I#KUF=*7eT&rWf`aKfW1l_9N-r(GT1L0vZYe4eL+tkcrc*-~49f zOy;*d3{4KlH=no5W@ga3`scb6e}iLl`^6T|%R-C|tGBoCGknlyr7~ovd-XzJ5g6`V(;sA77t3*tx^UF~mHr z>d)PtRoQB`uiqQzSV=dmx2&xH#A?lIclO3~CI+GP6Tio;N#uX|JwS`0U=3S<5W|XP zGMTHrk1;SbFnGE+hDb7etXt3i>q7Hi_M-&{@}yoiCbO>mUu1hf`|+`}FBqZ4SnStl z`wufQ+^^r`&YxGn#E`4zEcL&2-u7_e0>%brc7Bl=@0HRYG^gKjo|3(!e%kj+-}yVI zT$&}c%%NdNc;nv~CaIVi&=by^Ju=26D;s0N9sVodrzEnS&b&{V~ zPj$tSpn6FLhqybn{@0t{Foa+B-+jG>&w6vhrzdK#n)$^lb_UtN&i^0hU94Zy8NeWL z>976SKkAGP!Tno>+SdxD*FOkOzvKMmwy?*Y4Q!nCmD0cD_IIyOKC|a%DCkhs zPiwP(BK5m6#QlQ)H?wxB4@V?_=or7-%EoZyh<@z8iD7H*IcZOLpwH z-B2zrdwbukdABWYv*dp^yk2`gzH0Ry28H6u4*r}Dw_Y&^?)=RWQkmKqG%Zl)_iOK0 z!U_NHT338XcohM6HK_ENbkLufVP7!=!%2pOe}_yndHENcJ)SS_xmw|g0>jjc3(|I7 zOTKs6fu*!wfnmar>hJfDzcUFu&2XTU*W5(LJWmGN(-XLo$#CGR3PS@Q6T=Qp1^1l{ z2VNG7pJHU_Vq@n#&EPg~O+%56vP9^G2jNT%Q@GNNnp;F(becd{D6P26*sxk}6BEM} zh7fs%0_XiPmk&2>z4i3Qyk~Wl52du<-%Qr27k)V5xQJM)4>N{ZF2oU(Ua~e3d2t^?PMj z2A0(JDWAU|NPf_~z(tb5A*7Y3p=f$UfT=M9(*mC~j)tqS8ORmKu3VhX_@(~rsn=H- zW72kCV{G^vll1KC^Q`F%H|AHe8Zn&WWzY&_5(q6Yv*ps!?a-P~8xYK}V1_6!d=O*B zT+_w>J%qpM?34Jk<;%Y$BNhu5vm0AqEtkty<%_-}kpJw>(~m|K`*awrmz|H9W&ZpA zuICD(+>D#j6j)}}t20PgRn+I)E57+G-iV=Ohu!xzwhXrf8Ky)rP1q@!W}PA!QpMU> z#L%F@aG|2Nx@}Dd2fQp>wdP{8bj-4A+zgj|>NG&pxtovNJ;==Z?0(mts2?l>6U>Fz zr5)*RVpu52VOKCgRe53Eg92eYh68Q)&oOLJY+z&9tEe{T27NHLvQ+{SWz+xlgv*U$ev>#$DS{ux`| zaZO{`vij%wRXhv}uGC+b`SMSjgP}{$x)IvsSs}~Np#Anv=w(nL9m)9Z^9}}wSwEkj zm|5s$@c-C`-Byp=of?FU1iH?7RP4y-H~U}7(9pZb?BA^yuWN1nQaLVo`^#z?H0aN* zGd;g&>ft}T--%i@zn}Z{90$Xx%q1&j85}fEOQbc)U(4=dim#6rVGvY0Um9r0zy+N+ zSy0Bnux}E>{eApQB8&`5?lX!rkKHcq*AZCI!Naorw($5-028eRDyzPrm|(!(`ZxBT~FXb1{Z(lBRmP=D#)k6?PQPN1`Brzyayn<}%*zcz4L;B8d6^2l zY9^{OI7)IXl;r&OTI0J>gOte$v;AUysi&ts-Fts+^!7C0zx;Zv8lj?03{PkL)E8x# zl62=bGsBd{E{v+s?F<4T+6)T3Of5_d_jyX%co@=CroOkEUHKwwpcB4x75ie3 zM?4#>V&lkiXP9u!_rBzwIrFtQ>71W_rDuK2vfWpHhyE_z!O+0VSkk-y9K(k6KX3nL z1m_o@7rm@@^!(|~|9BYBys5WisMiRc$>1QxvLfJZt*RnJsRBd5rSG#B2CAH~hmKuc z<3Q|7=jl&gx7_!ZW4N&Fo*v_dv-{+dzCus+U`1zkF)7EqQd5`OAxk&RbHi*MSV`@h!-F?h7{!%En#_8cq37!1x||9UU( z%iH(=q+_e!ZVm1Bum5%V%S!*+`mS|5pGp1tZ2!Ob*AsR7NaK%p>vtP}t={0xFlm}} z$=W>&7#n8PYqDw>h1yL%`TAb%hE5p<1A&Aa8}6HV#%xYxm#r%jul>)y+jqmpbm4Pp z^UfE3Fq3~=toYcA_x^7$@9Exe)6ef@a0oDiE(Tz6+{(zfiiu(0x3AKxvVOf4UT+I>~`JvWOm<)1&`F_b4?S! z8*ZqUY3b88dUQr)er4UOpO@3z{{C6I{ZoCDY5l`lP2WQ=L_faLvd5#!_Gw-GuZY)ifN-14*W-<7m4a}EFOHs5rx&&p}b%(qcJN6ycm&XH5KL4T`cz3`s7(PjquM;j$| z>%B8RO{sj6_3DK2iOjt`UcUVPLHqwDe^O{?WcWJyO!m7Dh6Ca{b^hOeuVQ7`P;gXj z*5(Y~NCt*q;vn8EmV0mp}Zv_~paa z$&ar8{?qCvY$hDQmOuAbifzBV;;*UMMDiT3Sge>k7nzu&v;tFXtfNLW#v#nj;8KD*I%iXsC; zy%#fs%%Y@l#S0G>RQ@_t!8R-XzxkGTni)G*^y-!nlq+mYgZ=s|85hQUFZ4#xg103n%Q` zt@^`ff1K0Bs<^1lmF0ixw!O8T!o^UO>~kh^$Fc?WOAfd3-}>@-+xnl2Pw#lGsxbMG z+3$6tmXjKsoUS<@HFAZWnHNJee>GVlFIu|R$n7#ciLARxLx3<V?MG|*cp!WWEE#E|9yK|h!JxRgTiwbh8>q)9aXVDv(E6tPEqYoY47W6 zx8=v(Xp6PuzrTtv(^qYB6fJ!mabYXV-TYo?Yy7qs>IobpL~j6@lB%=1vN{#&$3L zPq0ISFvE-M?~NaOuKc}}sbTj!tGq*@(-M~d->uLv=kZlWuSi`cXc7SJ?Xxmv*zr%g z{=V_DiL-y4jo))_#{ci%ug`ptYd0Re^qtiK zKhl=G{c!bEcJl0Lj0<|##w#k1o3T1y5^K_>{e;Fn{&ZxpM^mT z4bJAg-edAVdtLS-$-nNC)=!)>m-B(qYdeMjuinaQat!qgRT=h8YS2+-*mvds z5+Md@29?x+C5#N=oDF_I^Un)0NHcvfo6f2-m0^Wj17aa9$gvJ$3?KIY|6ZEr7L)e< zro`rl&nN7v=abu9mm!;5x4?d9+K;V)rAz<0^cWHFTmo+z#x0(%XDEj28Jno3{FQk|F>d3z{ap| zR-QaV!ef2KW%_H6-N_3%QTX!;Q`O&@Pgg#RUsQQfAS=?eL*?szvp<{Ozvfn0@94!C zv-!EAB*WA!rWe2TCWXa+Fip`BXDFy;`&NAG{QD-+JIoBH!FGbJ1bHr$fua8MZ{D-7 z84oZt^zJ#pFn^)&Vg1LCqrRSEYB<5A&rtEtDY-FndU07jgW-mnUT%gLX>E3o-$gxD z$dq)L9{DVJUn)bbgWE5L7ex&7f0n0~r5OI-cl~j+{_Raxfc7=O(|R*dNKQD{r6Nhm9N|AR7 zN|zm3@7z6{KH8Nu^ zpMP$p{Pdq82Xu~Z0UtBNyLbC7`9M?geG?cDeEq+Ry@4RoR>pEw)?AXcN-jxgu$6M~aJ}~VSBZJv<9%G49Awmoc zERYfpvfPq^L6nJMF}u0SvKhCH|Ln{Av`?hC)^EMQfy8F!z50?2YfL_$KQ;4z88br_ zYjc*H2Ya2_ujJ!>rv3MKZ}h%bror-H%HLgvmo-_;QcV8)!PW~pGBC`QVYm_%!^_~X zbc!`&!#myuhp%6~YZn)=exC9FeYc8oIqK!-?QUtiZW?rWN#?V_ZQ^ThIm|A9f8Mx< zS9rFSDMNv2_7j26=MT2UGc??LZn!SHHo?7rVzOW0>&k%d%%b;}{+o{qYnyVD@JzLqq4;%`3v^J0APseZr2JA^g^lj$Iq)%GER6 zh!l-va0qg9yH%bm{b$Qx7En_IGE@esyhE563Z6_W(dK4|*ixf>Hf~3o*xDN+?x*jF zc5Z!@d(4in`hKa7=2RPRPWO!$1sNPRN-`{DaIkOB`!Hk6q2@W?*J_}(20|DZ&g2`v zv}BlY%cWkgs(M@JlDAtJ7*@zJT$o>~!LVVyHxt9R@>QD|Ywmjo{cPZ6h^wlyul?}L z@z;a5!e0(P4L(=#@<`&Xor&USXKm8sgJytLCJY^qZ{OeBeT$n7RJhz=aLD>od+_v? zr_)xg=3?;34io2MxHND1G=_$|Up8Dhaf$gr9)mO8L+utp_o%`;^EivYI z3vSQabs?Ag-NM`T;bo>5Ycs>8Hol0fs`yuHl3l1jYtK8yS)Vev*H-;wu>JPy=MPgk z`}%o(^D5@_y@_-^{%!rz#s2S>9`=`CQrn-qcqIytjd3-in3cf$3dKr(Gwe3p4CUTV)u}pXL_(}`WMy<&+RO>K6$*OMoag|4|g+; z7gtwL7iK8f@N@cvWJ89GdgK2>Isa6j%m9sBOh3WMVEA9?@UzmTs@zpGB{uI8ziMxF zmx1B8shnL|!@L`2=Z~D6-go(-_w&wP-({^#@vi&@|FrG6Ez$zHN_ zvwBeQ?cWl{duGm(61y-%@GKjH%3gJd|4y(nF)*BBV#wQFFSk{4?X3Df|Jqln8u+BKOZgg5kvXN6ZXTOjDQ{WbWPentbdG zHzUJD+4|4s^}z*e&OQ)l>EGPHwSMNq1sTSF&fU0q!L+LE@QI51Uw>Jo#O&Fh=M^`{ zZr`nz+B?!af1ms}fic!z z|L6R24~7TP|MXA(X@B#(r*g&5?TQWW_q^X}CCvb;&!5Fh*Yg?vGh>)=LBOHjp@D&c z^X}33=?qIu|9^I5*v;aw;1K_I9|OT=2J0e*17;hfSb8K3LDdTbxb?iki(vut6y_2Z zh69YDetHZKj6Rmls=rist@O#$SvqV+xsp4hm>8bwz4u^d$ho7sHNK}l=c5@Y&&&`Zpm2`K;>V+(Obj2+>HpVeV~GE8Nc_=X z6@~+kV;B~spPyHGJ845M!-3;l9zHLWF=LoeD8*24gTbMvKIflqvcBT?%M1<9>$ck4 zLx*J+TuNkMaG1&1FgLT2qkj#9!jTWVztu80oPTlqxzpMG{7f&@8s~~K%ve*;$<1(s z?LHfWnZgD}hWd4O3|0>(o#?Nr$dodG(?dSCj4AU95%nTP2KE3sg6hqFv>N#<{ zJ_&C+Yk&MpXm)b3{_%UeKJDYo{T99^KAwT`h)4H9vBf&a-`3i0JO0k@;&itEt2w1P zUKIYR3d_Bp8MmC59n8min?k`BTjPO69?d^H%1D)th7% zcr`3!U^sAOx;RtMO6k|E47Va~YySHdVL5->llkjjPCr(6bVmK{luvuVbTQ7AWcZM- zCvd?0_IoCVZx;L7YwEXhG3?+>;A5Eapsg(UxPE6flTO^u-f4Na9drIzs=ST2e-%{E zU=5}jZYOjHPTT)pk72>(f09f$R2jcn#CtZ#Dc@w+wz2%~`B0$)YV(zk{$Ylmx|Pbr z5T0o1P|d*5KC@TGabEJij|;!Q(3tpTr-(yC<>j{78yFd8|MX_xJxk#6`s079661x} zy;hNSSjWt;B9F7-3xftb!-ua7E9$2TF|aYT%imn0=n%to;3mUae*J|jxy2?)RLp!k zJ@+Kj2IsWjskuFYotV+>_Z?701 ztp4b)&3GZX#+D&#Ddz+B_3|owa~Tz$GW3>i&d55Qlr_V0_K}3$J^SZ8PFSp;cHit@ zQJ-_q#u@dtx8J{FToC;4Z4Sd-=6Z*?_POu!zcXBT7T>>lHq$4Ib37MP8SNMn%!6S& zDYax7wp3d>uye~ZXc+vrV|ZY6%9CM%h;saDh6C)35jp>284mb;-p<&d$GV~aHK-4B zLz2NJI$n$6!uMBeBpIqC9quwa%&v-jcb<)*s?uSvQUe=9`5R3=L&^>^ry^8ZQ6& z{3*kZK_F>~^ZD+NXSo>OoU8v)b8g>syYM%kPyQ~~6;F3&;AN<>Wr#WZ>&^E^S;wAB zrDt81WoTF&!SG;Lcsd)yC6)_YzsxuLb?eRT1c&u33cd`R85&eL7Sy|)Vq_>=8<~*y zxAgP=wu#0`3>(tkA8ZO`$hrJJn(czwUrz>yO^hlz3<}TgUuC$!&JfdZDD}hA`hWKN z+6M#+BO9#JmjAlFKAySZcK&|Z|1%(iTT>aB85p`)81|K3JI%>Zlibb9u&#O<7lVx| zry+w!1H(#5hFvTU=l>n|{crO-=fxy11_p*({0uiz8TLJ1$l$R2_4JWddw=^dFic@%*i};h(n&@DJklHRk%8eULn;eHnXpang4o-h#$S&v z`Ez1@ZdBXCnLkJSzZhcyH5J59XU}H zTYo6(`^JmcyqRB3xXQx9@?t4t?88^w3#!>}oMpIth+Xf^_31bM#@puKPJhB9sr*~x z`@L%YLP%TKaVZ1C6y_yN4T{0>+6)YgFW=s~@_UWuzokqKOP){mTp&|lyW4Pq?PL9~ z|74Q>J)ObNaH9O}th4^V_q|!e_&eR_*w20J(hM3L6WAHvy}UQK=<90+22}=ze>(5? z|F8SQ%m;2%hNwv}Fg)mRoP188ott6FnLKOXiWgc8k(b|j&t2-H5jPZ4BSm?4Pr}vElrT?0_Zbz2h4$)ZWk8 z&&FV8afu<};wIjYpX%>$J1{h~{8`ie^4jS?me+Rm_iovnvtUN{&AQj8eyhDnWv*p7 zz{>c=a{j~bYsDU9NzB+D)$nysB`@PuOT!;#0vpbA2S6u}PBAkCoo1}+wW`1La#8%@ z%SRqIsp@eAoJ(bJW@wl<@%vnDc7}o!J{QjS8yOfPp4n@aN;=#xJ7Ltoz;Kn3!Hng> zTTyF$aR&y&Uq$E4{(FL~-Ewex?sdcPX&tXCe;8kXoWpQItnjdX+_&>=4EJ|G49hZp zuHrWL_3hN?>mN2ZKEL42d}^E7t#9=fdwmq7>lm4h{IXu%^!fZ=&VGIa!@cXz-}W%P z6Hj1fs-BbkBh`N0_k3%$(+pf36N-!O?NgWjmtXT(S`F4O)na7`I>l(E%#gudwcy$!y_THB1p0a9<8S80=bF_t@=%ds$=)_Br^IxoAO-g{r_f5{d=J%t+(|@ zIt0ri;RSu`+Qn%7z8YiaWlj`i)T16W7kI3wsWED^*8_gmXmvj#i0CNsPsJ5 zR+}q-PXDd_&d5;EKBLy!Y4*3ZH#a!f#c6c^CFjLk9tPPm;RCw6zg@obb2Sgc1389E0tVB09r*8< zPsrQxux*bVL(;F*XlI7I%noV)zFJi8bcp@G{`k)-h7a!-y~$=+kp3t3<-aoihCMgy z+}#@f?x}qFkBgz>;Qpu6qJ3Wcg6-d2kj2R0Zt0ND%3#~}#*0O@Ium7rYJLJC>Xx5KpsETfneZ2lOZw$kMJcf+# z3>&Qf-A=oImARq0nxR0yVTX!>c>SDL>z$byzChOpt+L~JafM-l_j}eO6FIyETxZwI zGZf6M*v+Dldp}*|^0k)dX>~G}Zuqy`r7?F!onu(xRuaZ=!Km8O)HmAW^tEl5*0i3^ zd@$jnTE*=Ck2|Y(e^<-hwp1>@p@A=V!&jZ%OYV8UFsV2DR~6m<*Jj^S_E?5`hf_=? zVGY@=41agU*n(;yW`?A1vb^wfB37|5_}nQ--X3)6jCIbPir)^88nl)#sd}fv@!+32eSgj7q36Nul7u7tPsP7<7tcxisy}UouBk< zX`Arv?+%%S7bmKAy<9fC=jZrzrSaad1;A7$$AD5-~e|>7#hkL7~UrSV+7TW ztEP6{k7HPH<7qvscdrS9!b0BteM>_Am@p`)#WOU_`2YXwPW@-C@0b;mm&zz`GTeA@ zf|a2}tl{<6V*iGfy8GX%FY2w2cKLI{!GRgntN`W43!r6&9T%^y{9$yDl_5sJVgBah zHyIobeckiPCV~~xDLS!uU;p1-Nf&RlPEzw+%^nEqLR^WR&4 zP8UipU;o+md~CVw`Rcc33=^i*SDxL)(s2B=ojIG#U4xtH{~lkcWm?j`-+|%XgM4O& zNW}(uRwj?~I$nnQlvaki5=VyXYpkz7ye;q`J9&R<6R(y1rjOzR3#!>X{2Aob_cF4u zthu$%`28Mjb~?fd4=PUBp+eQ68_uClQ>o%ugw*T!Ra zw(ChgF#TWCcl<*{?b{84zHAI%sxQo_XJ{y6VOUqhF#jW8JtITTo%_|5E;&z*p2=oV zNMvTH?TrcNWk{I$pNZi>+HB`(uRl*^K4EcJ=fYG@g~u#RdrF`Ft&qvT&ERn9-`B-@ ztQUBh-fpR%%bQ?sbmei)O$H_g3+V^bqVo)4!$~2j3M<_9?@qkMqxaKCfqE=#yha zgp=y*e|@XUv##|2lue@s}m_v5OX*=8frPgB>=*z~E*0H+(awm3k{zltG+fL-3!QBH6*~ z&(_yo>SFv=`7C#bgu58W1LOZj^WI;r`f=Fel2p*G)m}?GdC+NGr zz=7*50pE7+i+g|D_|Keg=M@DU&V613D%ei#pHX*L+#&1F)|b!Y7;4rWe`jaNup#>o zYru!smn9i~-TNdJ;0FL!L%6Uv|>?6Car>)P04{nBqnoArK| z2|K)GRM`4|Pd+mP-|a82FW53H;cw8M6c;bWAn+k!FQ3$%{pSBRwnNIm9tMVG^7WwJ z-ZsXD+$TSGoa4LjEMD$yDpPDKbJD-1JPv6;Oj$Oh|9v_`=K8bvKF?qKxfwcEUg!O< z;&#<^_RQMJkM=1Sd}yr}WIyU_1ry$k*^y9eH{YktwlE_b3^(YfsiL&Ns>d%wpq zFz_>Etg4=10k*kmfgcM)!Y^%hW(J0OJ3IMRNem7D#g9?qNaWAo{+YH#+j=oO#S{P%6+ z+}F!QS~7p7%L+TMo6c6!$|hd*(`n_~>%aS|{_hZPFk!x9@>(&*N@v*itkZ3m6&paybYweE7;yz{p^DtL((jd3)P__0-3KJ0yL2QXbLE zz8|&!2I-W98#6R~WanUD(2!-Avio$srY}RSz=9iU4M`7NA8h+wRLvXVGwCV37VHz;NKPpM1P*`;6l1n-1~}0?hf+ zb=CJ-8NclOxp?=*MTWK?`fb7epbJ+y7!v+4GBGe%*)bI8GOti<=(*}C6!U3cL @cFSSjyPYre1ZQm0?GH_I_T*7={IP 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�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 diff --git a/core/src/io/anuke/mindustry/world/blocks/production/LiquidMixer.java b/core/src/io/anuke/mindustry/world/blocks/production/LiquidMixer.java index 2f7562b82c..01e96fb5c3 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/LiquidMixer.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/LiquidMixer.java @@ -21,6 +21,7 @@ public class LiquidMixer extends LiquidBlock{ hasItems = true; rotate = false; solid = true; + singleLiquid = false; outputsLiquid = true; } diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java index eacbdb2de8..be204b4dc0 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java @@ -32,7 +32,7 @@ public class ConsumeLiquid extends Consume{ @Override public String getIcon(){ - return "icon-liquid"; + return "icon-liquid-small"; } @Override diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java index 80be0c49aa..03750ffa3b 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java @@ -47,7 +47,7 @@ public class ConsumeLiquidFilter extends Consume{ @Override public String getIcon(){ - return "icon-liquid"; + return "icon-liquid-small"; } @Override diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumePower.java b/core/src/io/anuke/mindustry/world/consumers/ConsumePower.java index fcbb35995e..d05ba2c4fa 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumePower.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumePower.java @@ -21,7 +21,7 @@ public class ConsumePower extends Consume{ @Override public String getIcon(){ - return "icon-power"; + return "icon-power-small"; } @Override From 322d76b713d1b9abbf25786407c5a6c8c7fd4311 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=82=A4=EC=97=90=EB=A5=B4?= <44261958+Kieaer@users.noreply.github.com> Date: Fri, 23 Nov 2018 22:41:55 +0900 Subject: [PATCH 15/32] Update bundle_ko.properties (#354) * Update bundle_ko.properties * Update bundle_ko.properties --- core/assets/bundles/bundle_ko.properties | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index 6b031d5de0..e72a97601e 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -319,8 +319,8 @@ text.blocks.coolant = 냉각제 text.blocks.coolantuse = 냉각수 사용 text.blocks.inputliquidfuel = 연료 액 text.blocks.liquidfueluse = 액체 연료 사용 -text.blocks.boostitem = Boost Item -text.blocks.boostliquid = Boost Liquid +text.blocks.boostitem = 가속 아이템 +text.blocks.boostliquid = 가속 액체 text.blocks.health = 체력 text.blocks.inaccuracy = 오차각 text.blocks.shots = 발포 횟수 @@ -345,7 +345,7 @@ text.category.liquids = 액체 text.category.items = 아이템 text.category.crafting = 제작 text.category.shooting = 사격 -text.category.optional = Optional Enhancements +text.category.optional = 선택적 향상 setting.autotarget.name = 자동 조준 setting.fpscap.name = 최대 FPS setting.fpscap.none = 없음 @@ -623,7 +623,6 @@ block.rtg-generator.name = 토륨 발전소 block.spectre.name = 스펙터 block.meltdown.name = 멜트다운 block.container.name = 컨테이너 -block.core.description = 게임에서 가장 중요한 건물.\n파괴되면 게임이 끝납니다. team.blue.name = 블루팀 team.red.name = 레드팀 team.orange.name = 오렌지팀 @@ -668,6 +667,7 @@ tutorial.daggerfactory = 이[accent] 디거 기체 공장[]은\n\n공격하는 tutorial.router = 공장을 작동시키기 위해 자원이 필요합니다.\n컨베이어에 운반되고 있는 자원을 분할할 분배기를 만드세요. tutorial.dagger = 전력 노드를 공장에 연결하세요.\n일단 요구 사항이 충족되면 기체 생산을 시작합니다.\n\n필요에 따라 드릴 및 발전기, 컨베이어를 더 많이 만들 수 있습니다. tutorial.battle = [LIGHT_GRAY]적[]의 코어가 드러났습니다.\n당신의 부대와 디거를 사용하여 파괴하세요. +block.core.description = 게임에서 가장 중요한 건물.\n파괴되면 게임이 끝납니다. block.copper-wall.description = 구리로 만든 벽. block.copper-wall-large.description = 구리로 만든 큰 벽. block.dense-alloy-wall.description = 고밀도 합금으로 만든 벽. 구리벽보다 체력이 높습니다. From 8a0761cad819eae63abbe2c295cc41924cfd57b5 Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 23 Nov 2018 09:23:42 -0500 Subject: [PATCH 16/32] Bugfixes --- .../content/blocks/LiquidBlocks.java | 4 ++-- .../content/blocks/TurretBlocks.java | 21 +++++-------------- core/src/io/anuke/mindustry/world/Tile.java | 2 +- .../anuke/mindustry/desktop/CrashHandler.java | 1 - .../mindustry/desktop/DesktopPlatform.java | 3 --- 5 files changed, 8 insertions(+), 23 deletions(-) diff --git a/core/src/io/anuke/mindustry/content/blocks/LiquidBlocks.java b/core/src/io/anuke/mindustry/content/blocks/LiquidBlocks.java index a9e9f97155..3ca87efef1 100644 --- a/core/src/io/anuke/mindustry/content/blocks/LiquidBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/LiquidBlocks.java @@ -67,9 +67,9 @@ public class LiquidBlocks extends BlockList implements ContentList{ }}; phaseConduit = new LiquidBridge("phase-conduit"){{ - range = 11; + range = 12; hasPower = true; - consumes.power(0.05f); + consumes.power(0.03f); }}; } } diff --git a/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java b/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java index bce9e3bb5a..34bad3e84e 100644 --- a/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java @@ -32,24 +32,13 @@ public class TurretBlocks extends BlockList implements ContentList{ hail = new ArtilleryTurret("hail"){{ ammoTypes = new AmmoType[]{AmmoTypes.artilleryDense, AmmoTypes.artilleryHoming, AmmoTypes.artilleryIncindiary}; - reload = 70f; + reload = 60f; recoil = 2f; range = 230f; inaccuracy = 1f; shootCone = 10f; health = 120; }}; -/* - scatter = new BurstTurret("scatter"){{ - ammoTypes = new AmmoType[]{AmmoTypes.flakCopper}; - reload = 70f; - recoil = 2f; - shots = 3; - range = 220f; - inaccuracy = 2f; - shootCone = 40f; - health = 120; - }};*/ scorch = new LiquidTurret("scorch"){ protected TextureRegion shootRegion; @@ -117,11 +106,11 @@ public class TurretBlocks extends BlockList implements ContentList{ arc = new PowerTurret("arc"){{ shootType = AmmoTypes.arc; - reload = 55f; + reload = 80f; shootShake = 1f; shootCone = 40f; rotatespeed = 8f; - powerUsed = 7f; + powerUsed = 9f; powerCapacity = 30f; range = 150f; shootEffect = ShootFx.lightningShoot; @@ -132,7 +121,7 @@ public class TurretBlocks extends BlockList implements ContentList{ swarmer = new BurstTurret("swarmer"){{ ammoTypes = new AmmoType[]{AmmoTypes.missileExplosive, AmmoTypes.missileIncindiary, AmmoTypes.missileSurge}; - reload = 60f; + reload = 5f; shots = 4; burstSpacing = 5; inaccuracy = 10f; @@ -156,7 +145,7 @@ public class TurretBlocks extends BlockList implements ContentList{ size = 2; range = 120f; ammoTypes = new AmmoType[]{AmmoTypes.bulletCopper, AmmoTypes.bulletDense, AmmoTypes.bulletPyratite, AmmoTypes.bulletThorium, AmmoTypes.bulletSilicon}; - reload = 40f; + reload = 35f; restitution = 0.03f; ammoEjectBack = 3f; cooldown = 0.03f; diff --git a/core/src/io/anuke/mindustry/world/Tile.java b/core/src/io/anuke/mindustry/world/Tile.java index b75b89e433..b6b87da8d7 100644 --- a/core/src/io/anuke/mindustry/world/Tile.java +++ b/core/src/io/anuke/mindustry/world/Tile.java @@ -241,7 +241,7 @@ public class Tile implements PosTrait, TargetTrait{ if(link == 0){ return (block.destructible || block.breakable || block.update); }else{ - return getLinked() != this && getLinked().breakable(); + return getLinked() != this && getLinked().getLinked() == null && getLinked().breakable(); } } diff --git a/desktop/src/io/anuke/mindustry/desktop/CrashHandler.java b/desktop/src/io/anuke/mindustry/desktop/CrashHandler.java index 4d434e32ee..d3bb8e1976 100644 --- a/desktop/src/io/anuke/mindustry/desktop/CrashHandler.java +++ b/desktop/src/io/anuke/mindustry/desktop/CrashHandler.java @@ -80,7 +80,6 @@ public class CrashHandler{ ex(() -> value.addChild("gamemode", new JsonValue(Vars.state.mode.name()))); ex(() -> value.addChild("state", new JsonValue(Vars.state.getState().name()))); ex(() -> value.addChild("os", new JsonValue(System.getProperty("os.name")))); - ex(() -> value.addChild("multithreading", new JsonValue(Settings.getBool("multithread")))); ex(() -> value.addChild("trace", new JsonValue(parseException(e)))); try{ diff --git a/desktop/src/io/anuke/mindustry/desktop/DesktopPlatform.java b/desktop/src/io/anuke/mindustry/desktop/DesktopPlatform.java index 1a353b0656..d4cd5ad4e7 100644 --- a/desktop/src/io/anuke/mindustry/desktop/DesktopPlatform.java +++ b/desktop/src/io/anuke/mindustry/desktop/DesktopPlatform.java @@ -17,8 +17,6 @@ import io.anuke.ucore.util.OS; import io.anuke.ucore.util.Strings; import java.net.NetworkInterface; -import java.text.DateFormat; -import java.text.SimpleDateFormat; import java.util.Enumeration; import static io.anuke.mindustry.Vars.*; @@ -26,7 +24,6 @@ import static io.anuke.mindustry.Vars.*; public class DesktopPlatform extends Platform{ final static boolean useDiscord = OS.is64Bit; final static String applicationId = "398246104468291591"; - final static DateFormat format = SimpleDateFormat.getDateTimeInstance(); String[] args; public DesktopPlatform(String[] args){ From 30b5dd63e44ff30d91eb8477fa0ba9fba1fe70ee Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 23 Nov 2018 10:21:47 -0500 Subject: [PATCH 17/32] Build tag fix --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index c8349974ea..c0f4f1a5e8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,8 +3,8 @@ jdk: - openjdk8 script: - "./gradlew test" -- "./gradlew desktop:dist" -- "./gradlew server:dist" +- "./gradlew desktop:dist -Pbuildversion=${TRAVIS_TAG:1}" +- "./gradlew server:dist -Pbuildversion=${TRAVIS_TAG:1}" deploy: provider: releases From e5d67405554936157931a04ff07e2334c078c88f Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 23 Nov 2018 12:40:36 -0500 Subject: [PATCH 18/32] Additional tests, inventory fixes --- .../content/blocks/TurretBlocks.java | 2 +- .../content/bullets/TurretBullets.java | 2 +- .../anuke/mindustry/input/InputHandler.java | 2 +- core/src/io/anuke/mindustry/maps/Map.java | 9 +++++ core/src/io/anuke/mindustry/maps/MapMeta.java | 9 +++++ .../io/anuke/mindustry/type/AmmoEntry.java | 4 +-- .../io/anuke/mindustry/world/BaseBlock.java | 2 +- .../world/blocks/production/Smelter.java | 5 --- ios/src/io/anuke/mindustry/IOSLauncher.java | 2 -- tests/src/test/java/ApplicationTests.java | 33 ++++++++++++++++++- 10 files changed, 55 insertions(+), 15 deletions(-) diff --git a/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java b/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java index 34bad3e84e..7307ae5a6f 100644 --- a/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java @@ -106,7 +106,7 @@ public class TurretBlocks extends BlockList implements ContentList{ arc = new PowerTurret("arc"){{ shootType = AmmoTypes.arc; - reload = 80f; + reload = 75f; shootShake = 1f; shootCone = 40f; rotatespeed = 8f; diff --git a/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java b/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java index ba7cac85b8..addcb75960 100644 --- a/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java +++ b/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java @@ -304,7 +304,7 @@ public class TurretBullets extends BulletList implements ContentList{ } }; - arc = new BulletType(0.001f, 30){ + arc = new BulletType(0.001f, 26){ { lifetime = 1; despawneffect = Fx.none; diff --git a/core/src/io/anuke/mindustry/input/InputHandler.java b/core/src/io/anuke/mindustry/input/InputHandler.java index 36722ffe21..111b2f9718 100644 --- a/core/src/io/anuke/mindustry/input/InputHandler.java +++ b/core/src/io/anuke/mindustry/input/InputHandler.java @@ -193,7 +193,7 @@ public abstract class InputHandler extends InputAdapter{ } //call tapped event - if(tile.getTeam() == player.getTeam()){ + if(!consumed && tile.getTeam() == player.getTeam()){ Call.onTileTapped(player, tile); } diff --git a/core/src/io/anuke/mindustry/maps/Map.java b/core/src/io/anuke/mindustry/maps/Map.java index 05e1a03e37..1ad60c0e1d 100644 --- a/core/src/io/anuke/mindustry/maps/Map.java +++ b/core/src/io/anuke/mindustry/maps/Map.java @@ -32,4 +32,13 @@ public class Map{ public String getDisplayName(){ return meta.tags.get("name", name); } + + @Override + public String toString(){ + return "Map{" + + "name='" + name + '\'' + + ", custom=" + custom + + ", meta=" + meta + + '}'; + } } diff --git a/core/src/io/anuke/mindustry/maps/MapMeta.java b/core/src/io/anuke/mindustry/maps/MapMeta.java index 148ad5a099..2f13ee59b9 100644 --- a/core/src/io/anuke/mindustry/maps/MapMeta.java +++ b/core/src/io/anuke/mindustry/maps/MapMeta.java @@ -37,4 +37,13 @@ public class MapMeta{ public boolean hasOreGen(){ return !tags.get("oregen", "0").equals("0"); } + + @Override + public String toString(){ + return "MapMeta{" + + "tags=" + tags + + ", width=" + width + + ", height=" + height + + '}'; + } } diff --git a/core/src/io/anuke/mindustry/type/AmmoEntry.java b/core/src/io/anuke/mindustry/type/AmmoEntry.java index a4e0559df1..d92c7963e5 100644 --- a/core/src/io/anuke/mindustry/type/AmmoEntry.java +++ b/core/src/io/anuke/mindustry/type/AmmoEntry.java @@ -1,8 +1,6 @@ package io.anuke.mindustry.type; -/** - * Used to store ammo amounts in units and turrets. - */ +/**Used to store ammo amounts in turrets.*/ public class AmmoEntry{ public AmmoType type; public int amount; diff --git a/core/src/io/anuke/mindustry/world/BaseBlock.java b/core/src/io/anuke/mindustry/world/BaseBlock.java index 6b3ef027e7..804f12703c 100644 --- a/core/src/io/anuke/mindustry/world/BaseBlock.java +++ b/core/src/io/anuke/mindustry/world/BaseBlock.java @@ -43,7 +43,7 @@ public abstract class BaseBlock extends MappableContent{ /**Returns the amount of items this block can accept.*/ public int acceptStack(Item item, int amount, Tile tile, Unit source){ if(acceptItem(item, tile, tile) && hasItems && (source == null || source.getTeam() == tile.getTeam())){ - return Math.min(getMaximumAccepted(tile, item), amount); + return Math.min(getMaximumAccepted(tile, item) - tile.entity.items.get(item), amount); }else{ return 0; } diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Smelter.java b/core/src/io/anuke/mindustry/world/blocks/production/Smelter.java index 49042d4180..e0481663f8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Smelter.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Smelter.java @@ -152,11 +152,6 @@ public class Smelter extends Block{ Effects.effect(craftEffect, flameColor, tile.drawx(), tile.drawy()); } - @Override - public int getMaximumAccepted(Tile tile, Item item){ - return itemCapacity; - } - @Override public boolean acceptItem(Item item, Tile tile, Tile source){ boolean isInput = false; diff --git a/ios/src/io/anuke/mindustry/IOSLauncher.java b/ios/src/io/anuke/mindustry/IOSLauncher.java index 5b7c7fbf3e..4938e4457f 100644 --- a/ios/src/io/anuke/mindustry/IOSLauncher.java +++ b/ios/src/io/anuke/mindustry/IOSLauncher.java @@ -31,8 +31,6 @@ public class IOSLauncher extends IOSApplication.Delegate { Net.setClientProvider(new KryoClient()); Net.setServerProvider(new KryoServer()); - Unit.dp.addition -= 0.2f; - if(UIDevice.getCurrentDevice().getUserInterfaceIdiom() == UIUserInterfaceIdiom.Pad){ Unit.dp.addition = 0.5f; } diff --git a/tests/src/test/java/ApplicationTests.java b/tests/src/test/java/ApplicationTests.java index 8c47aabbb4..9845480b31 100644 --- a/tests/src/test/java/ApplicationTests.java +++ b/tests/src/test/java/ApplicationTests.java @@ -4,17 +4,23 @@ import com.badlogic.gdx.backends.headless.HeadlessApplicationConfiguration; import com.badlogic.gdx.math.GridPoint2; import io.anuke.mindustry.Vars; import io.anuke.mindustry.content.Items; +import io.anuke.mindustry.content.UnitTypes; import io.anuke.mindustry.content.blocks.Blocks; +import io.anuke.mindustry.content.blocks.CraftingBlocks; +import io.anuke.mindustry.content.blocks.PowerBlocks; import io.anuke.mindustry.content.blocks.StorageBlocks; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.core.Logic; import io.anuke.mindustry.core.NetServer; import io.anuke.mindustry.core.World; +import io.anuke.mindustry.entities.units.BaseUnit; import io.anuke.mindustry.game.Content; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.io.BundleLoader; import io.anuke.mindustry.io.SaveIO; import io.anuke.mindustry.maps.Map; +import io.anuke.mindustry.type.Item; +import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Edges; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.Timers; @@ -205,7 +211,14 @@ public class ApplicationTests{ } @Test - void edgeTest(){ + void inventoryDeposit(){ + depositTest(CraftingBlocks.smelter, Items.copper); + depositTest(StorageBlocks.vault, Items.copper); + depositTest(PowerBlocks.thoriumReactor, Items.thorium); + } + + @Test + void edges(){ GridPoint2[] edges = Edges.getEdges(1); assertEquals(edges[0], new GridPoint2(1, 0)); assertEquals(edges[1], new GridPoint2(0, 1)); @@ -215,4 +228,22 @@ public class ApplicationTests{ GridPoint2[] edges2 = Edges.getEdges(2); assertEquals(8, edges2.length); } + + void depositTest(Block block, Item item){ + BaseUnit unit = UnitTypes.alphaDrone.create(Team.none); + Tile tile = new Tile(0, 0, Blocks.air.id, block.id); + int capacity = tile.block().itemCapacity; + + int deposited = tile.block().acceptStack(item, capacity - 1, tile, unit); + assertEquals(capacity - 1, deposited); + + tile.block().handleStack(item, capacity - 1, tile, unit); + assertEquals(tile.entity.items.get(item), capacity - 1); + + int overflow = tile.block().acceptStack(item, 10, tile, unit); + assertEquals(1, overflow); + + tile.block().handleStack(item, 1, tile, unit); + assertEquals(capacity, tile.entity.items.get(item)); + } } \ No newline at end of file From 66c29c49e51de015f8e03e520ae0ee59e599fd34 Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 23 Nov 2018 13:32:17 -0500 Subject: [PATCH 19/32] Wave spawner moved / Bundle tweaks / Blank name --- core/assets/bundles/bundle.properties | 221 +++++++++--------- .../src/io/anuke/mindustry/ai/Pathfinder.java | 2 +- core/src/io/anuke/mindustry/core/Control.java | 2 +- .../io/anuke/mindustry/core/GameState.java | 10 +- core/src/io/anuke/mindustry/core/Logic.java | 2 +- core/src/io/anuke/mindustry/core/World.java | 2 + .../io/anuke/mindustry/input/MobileInput.java | 15 +- .../anuke/mindustry/io/versions/Save16.java | 4 +- .../mindustry/ui/dialogs/JoinDialog.java | 5 + tests/src/test/java/SectorTests.java | 2 +- 10 files changed, 139 insertions(+), 126 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index d89b093948..da381f256a 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -1,6 +1,6 @@ -text.credits.text = Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GRAY](In case you can't tell, this text is currently unfinished.\nTranslators, don't edit it yet\!) +text.credits.text = Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GRAY](In case you can't tell, this text is currently unfinished.\nTranslators, don't edit it yet!) text.credits = Credits -text.discord = Join the mindustry discord\! +text.discord = Join the mindustry discord! text.link.discord.description = The official Mindustry discord chatroom text.link.github.description = Game source code text.link.dev-builds.description = Unstable development builds @@ -8,25 +8,25 @@ text.link.trello.description = Official trello board for planned features text.link.itch.io.description = itch.io page with PC downloads and web version text.link.google-play.description = Google Play store listing text.link.wiki.description = Official Mindustry wiki -text.linkfail = Failed to open link\!\nThe URL has been copied to your clipboard. +text.linkfail = Failed to open link!\nThe URL has been copied to your clipboard. text.gameover = Game Over -text.gameover.pvp = The[accent] {0}[] team is victorious\! +text.gameover.pvp = The[accent] {0}[] team is victorious! text.sector.gameover = This sector has been lost. Re-deploy? text.sector.retry = Retry -text.highscore = [accent]New highscore\! +text.highscore = [accent]New highscore! text.wave.lasted = You lasted until wave [accent]{0}[]. -text.level.highscore = High Score\: [accent]{0} +text.level.highscore = High Score: [accent]{0} text.level.delete.title = Confirm Delete text.map.delete = Are you sure you want to delete the map "[accent]{0}[]"? text.level.select = Level Select -text.level.mode = Gamemode\: +text.level.mode = Gamemode: text.construction.desktop = To deselect a block or stop building, [accent]use space[]. text.construction.title = Block Construction Guide 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.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.showagain = Don't show again next session -text.coreattack = < Core is under attack\! > +text.coreattack = < Core is under attack! > text.unlocks = Unlocks text.savegame = Save Game text.loadgame = Load Game @@ -34,19 +34,19 @@ text.joingame = Join Game text.addplayers = Add/Remove Players text.customgame = Custom Game text.sectors = Sectors -text.sector = Sector\: [LIGHT_GRAY]{0} -text.sector.time = Time\: [LIGHT_GRAY]{0} +text.sector = Sector: [LIGHT_GRAY]{0} +text.sector.time = Time: [LIGHT_GRAY]{0} text.sector.deploy = Deploy 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.confirm = Are you sure you want to abandon all progress at this sector?\nThis cannot be undone! text.sector.resume = Resume text.sector.locked = [scarlet][[Incomplete] text.sector.unexplored = [accent][[Unexplored] -text.missions = Missions\:[LIGHT_GRAY] {0} -text.mission = Mission\:[LIGHT_GRAY] {0} -text.mission.main = Main Mission\:[LIGHT_GRAY] {0} +text.missions = Missions:[LIGHT_GRAY] {0} +text.mission = Mission:[LIGHT_GRAY] {0} +text.mission.main = Main Mission:[LIGHT_GRAY] {0} text.mission.info = Mission Info -text.mission.complete = Mission complete\! +text.mission.complete = Mission complete! text.mission.complete.body = Sector {0},{1} has been conquered. text.mission.wave = Survive[accent] {0}/{1} []waves\nWave in {2} text.mission.wave.enemies = Survive[accent] {0}/{1} []waves\n{2} Enemies @@ -54,12 +54,12 @@ text.mission.wave.enemy = Survive[accent] {0}/{1} []waves\n{2} Enemy text.mission.wave.menu = Survive[accent] {0}[] waves text.mission.battle = Destroy enemy core text.mission.resource.menu = Obtain {0} x{1} -text.mission.resource = Obtain {0}\:\n[accent]{1}/{2}[] +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.display = [accent]Mission:\n[LIGHT_GRAY]{0} text.mission.mech = Switch to mech[accent] {0}[] text.mission.create = Create[accent] {0}[] text.none = @@ -68,29 +68,30 @@ text.quit = Quit text.maps = Maps text.continue = Continue text.nextmission = Next Mission -text.maps.none = [LIGHT_GRAY]No maps found\! +text.maps.none = [LIGHT_GRAY]No maps found! text.about.button = About -text.name = Name\: -text.filename = File Name\: -text.unlocked = New Block Unlocked\! -text.unlocked.plural = New Blocks Unlocked\! +text.name = Player Name: +text.noname = Pick a[accent] player name[] before connecting. +text.filename = File Name: +text.unlocked = New Block Unlocked! +text.unlocked.plural = New Blocks Unlocked! text.players = {0} players online text.players.single = {0} player online text.server.closing = [accent]Closing server... -text.server.kicked.kick = You have been kicked from the server\! +text.server.kicked.kick = You have been kicked from the server! 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.clientOutdated = Outdated client\! Update your game\! -text.server.kicked.serverOutdated = Outdated server\! Ask the host to update\! +text.server.kicked.clientOutdated = Outdated client! Update your game! +text.server.kicked.serverOutdated = Outdated server! Ask the host to update! text.server.kicked.banned = You are banned on this server. text.server.kicked.recentKick = You have been kicked recently.\nWait before connecting again. text.server.kicked.nameInUse = There is someone with that name\nalready on this server. text.server.kicked.nameEmpty = Your chosen name is invalid. -text.server.kicked.idInUse = You are already on this server\! Connecting with two accounts is not permitted. +text.server.kicked.idInUse = You are already on this server! Connecting with two accounts is not permitted. text.server.kicked.customClient = This server does not support custom builds. Download an official version. -text.host.info = The [accent]host[] button hosts a server on port [scarlet]6567[]. \nAnybody on the same [LIGHT_GRAY]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[LIGHT_GRAY]Note\: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings. -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.host.info = The [accent]host[] button hosts a server on port [scarlet]6567[]. \nAnybody on the same [LIGHT_GRAY]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[LIGHT_GRAY]Note: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings. +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.hostserver = Host Game text.hostserver.mobile = Host\nGame text.host = Host @@ -98,31 +99,31 @@ text.hosting = [accent]Opening server... text.hosts.refresh = Refresh text.hosts.discovering = Discovering LAN games text.server.refreshing = Refreshing server -text.hosts.none = [lightgray]No local games found\! +text.hosts.none = [lightgray]No local games found! text.host.invalid = [scarlet]Can't connect to host. text.trace = Trace Player -text.trace.playername = Player name\: [accent]{0} -text.trace.ip = IP\: [accent]{0} -text.trace.id = Unique ID\: [accent]{0} -text.trace.android = Android Client\: [accent]{0} -text.trace.modclient = Custom Client\: [accent]{0} -text.trace.totalblocksbroken = Total blocks broken\: [accent]{0} -text.trace.structureblocksbroken = Structure blocks broken\: [accent]{0} -text.trace.lastblockbroken = Last block broken\: [accent]{0} -text.trace.totalblocksplaced = Total blocks placed\: [accent]{0} -text.trace.lastblockplaced = Last block placed\: [accent]{0} -text.invalidid = Invalid client ID\! Submit a bug report. +text.trace.playername = Player name: [accent]{0} +text.trace.ip = IP: [accent]{0} +text.trace.id = Unique ID: [accent]{0} +text.trace.android = Android Client: [accent]{0} +text.trace.modclient = Custom Client: [accent]{0} +text.trace.totalblocksbroken = Total blocks broken: [accent]{0} +text.trace.structureblocksbroken = Structure blocks broken: [accent]{0} +text.trace.lastblockbroken = Last block broken: [accent]{0} +text.trace.totalblocksplaced = Total blocks placed: [accent]{0} +text.trace.lastblockplaced = Last block placed: [accent]{0} +text.invalidid = Invalid client ID! Submit a bug report. text.server.bans = Bans -text.server.bans.none = No banned players found\! +text.server.bans.none = No banned players found! text.server.admins = Admins -text.server.admins.none = No admins found\! +text.server.admins.none = No admins found! text.server.add = Add Server text.server.delete = Are you sure you want to delete this server? -text.server.hostname = Host\: {0} +text.server.hostname = Host: {0} text.server.edit = Edit Server -text.server.outdated = [crimson]Outdated Server\![] -text.server.outdated.client = [crimson]Outdated Client\![] -text.server.version = [lightgray]Version\: {0} {1} +text.server.outdated = [crimson]Outdated Server![] +text.server.outdated.client = [crimson]Outdated Client![] +text.server.version = [lightgray]Version: {0} {1} text.server.custombuild = [yellow]Custom Build text.confirmban = Are you sure you want to ban this player? text.confirmkick = Are you sure you want to kick this player? @@ -130,45 +131,45 @@ 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 = IP: text.disconnect = Disconnected. -text.disconnect.data = Failed to load world data\! +text.disconnect.data = Failed to load world data! text.connecting = [accent]Connecting... text.connecting.data = [accent]Loading world data... -text.server.port = Port\: -text.server.addressinuse = Address already in use\! -text.server.invalidport = Invalid port number\! -text.server.error = [crimson]Error hosting server\: [accent]{0} +text.server.port = Port: +text.server.addressinuse = Address already in use! +text.server.invalidport = Invalid port number! +text.server.error = [crimson]Error hosting server: [accent]{0} text.save.old = This save is for an older version of the game, and can no longer be used.\n\n[LIGHT_GRAY]Save backwards compatibility will be implemented in the full 4.0 release. text.save.new = New Save text.save.overwrite = Are you sure you want to overwrite\nthis save slot? text.overwrite = Overwrite -text.save.none = No saves found\! +text.save.none = No saves found! text.saveload = [accent]Saving... -text.savefail = Failed to save game\! +text.savefail = Failed to save game! text.save.delete.confirm = Are you sure you want to delete this save? text.save.delete = Delete text.save.export = Export Save -text.save.import.invalid = [accent]This save is invalid\! -text.save.import.fail = [crimson]Failed to import save\: [accent]{0} -text.save.export.fail = [crimson]Failed to export save\: [accent]{0} +text.save.import.invalid = [accent]This save is invalid! +text.save.import.fail = [crimson]Failed to import save: [accent]{0} +text.save.export.fail = [crimson]Failed to export save: [accent]{0} text.save.import = Import Save -text.save.newslot = Save name\: +text.save.newslot = Save name: text.save.rename = Rename -text.save.rename.text = New name\: +text.save.rename.text = New name: text.selectslot = Select a save. text.slot = [accent]Slot {0} -text.save.corrupted = [accent]Save file corrupted or invalid\!\nIf you have just updated your game, this is probably a change in the save format and [scarlet]not[] a bug. +text.save.corrupted = [accent]Save file corrupted or invalid!\nIf you have just updated your game, this is probably a change in the save format and [scarlet]not[] a bug. text.sector.corrupted = [accent]A save file for this sector was found, but loading failed.\nA new one has been created. text.empty = text.on = On text.off = Off -text.save.autosave = Autosave\: {0} -text.save.map = Map\: {0} +text.save.autosave = Autosave: {0} +text.save.map = Map: {0} text.save.wave = Wave {0} -text.save.difficulty = Difficulty\: {0} -text.save.date = Last Saved\: {0} -text.save.playtime = Playtime\: {0} +text.save.difficulty = Difficulty: {0} +text.save.date = Last Saved: {0} +text.save.playtime = Playtime: {0} text.confirm = Confirm text.delete = Delete text.ok = OK @@ -180,9 +181,9 @@ text.back = Back text.quit.confirm = Are you sure you want to quit? text.changelog.title = Changelog text.changelog.loading = Getting changelog... -text.changelog.error.android = [accent]Note that the changelog sometimes does not work on Android 4.4 and below\!\nThis is due to an internal Android bug. +text.changelog.error.android = [accent]Note that the changelog sometimes does not work on Android 4.4 and below!\nThis is due to an internal Android bug. text.changelog.error.ios = [accent]The changelog is currently not supported in iOS. -text.changelog.error = [scarlet]Error getting changelog\!\nCheck your internet connection. +text.changelog.error = [scarlet]Error getting changelog!\nCheck your internet connection. text.changelog.current = [yellow][[Current version] text.changelog.latest = [accent][[Latest version] text.loading = [accent]Loading... @@ -198,32 +199,32 @@ text.saveimage = Save Image text.unknown = Unknown text.custom = Custom text.builtin = Built-In -text.map.delete.confirm = Are you sure you want to delete this map? This action cannot be undone\! +text.map.delete.confirm = Are you sure you want to delete this map? This action cannot be undone! text.map.random = [accent]Random Map -text.map.nospawn = This map does not have any cores for the player to spawn in\! Add a[ROYAL] blue[] core to this map in the editor. -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.map.nospawn = This map does not have any cores for the player to spawn in! Add a[ROYAL] blue[] core to this map in the editor. +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.editor.slope = \\ text.editor.openin = Open In Editor text.editor.oregen = Ore Generation -text.editor.oregen.info = Ore Generation\: +text.editor.oregen.info = Ore Generation: text.editor.mapinfo = Map Info -text.editor.author = Author\: -text.editor.description = Description\: -text.editor.name = Name\: +text.editor.author = Author: +text.editor.description = Description: +text.editor.name = Name: text.editor.teams = Teams text.editor.elevation = Elevation -text.editor.errorimageload = Error loading file\:\n[accent]{0} -text.editor.errorimagesave = Error saving file\:\n[accent]{0} +text.editor.errorimageload = Error loading file:\n[accent]{0} +text.editor.errorimagesave = Error saving file:\n[accent]{0} text.editor.generate = Generate text.editor.resize = Resize text.editor.loadmap = Load Map text.editor.savemap = Save Map -text.editor.saved = Saved\! -text.editor.save.noname = Your map does not have a name\! Set one in the 'map info' menu. -text.editor.save.overwrite = Your map overwrites a built-in map\! Pick a different name in the 'map info' menu. -text.editor.import.exists = [scarlet]Unable to import\:[] a built-in map named '{0}' already exists\! +text.editor.saved = Saved! +text.editor.save.noname = Your map does not have a name! Set one in the 'map info' menu. +text.editor.save.overwrite = Your map overwrites a built-in map! Pick a different name in the 'map info' menu. +text.editor.import.exists = [scarlet]Unable to import:[] a built-in map named '{0}' already exists! text.editor.import = Import... text.editor.importmap = Import Map text.editor.importmap.description = Import an already existing map @@ -238,21 +239,21 @@ text.editor.exportimage = Export Terrain Image text.editor.exportimage.description = Export a map image file text.editor.loadimage = Import Terrain text.editor.saveimage = Export Terrain -text.editor.unsaved = [scarlet]You have unsaved changes\![]\nAre you sure you want to exit? +text.editor.unsaved = [scarlet]You have unsaved changes![]\nAre you sure you want to exit? text.editor.resizemap = Resize Map -text.editor.mapname = Map Name\: -text.editor.overwrite = [accent]Warning\!\nThis overwrites an existing map. -text.editor.overwrite.confirm = [scarlet]Warning\![] A map with this name already exists. Are you sure you want to overwrite it? -text.editor.selectmap = Select a map to load\: -text.width = Width\: -text.height = Height\: +text.editor.mapname = Map Name: +text.editor.overwrite = [accent]Warning!\nThis overwrites an existing map. +text.editor.overwrite.confirm = [scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it? +text.editor.selectmap = Select a map to load: +text.width = Width: +text.height = Height: text.menu = Menu text.play = Play text.load = Load text.save = Save -text.fps = FPS\: {0} -text.tps = TPS\: {0} -text.ping = Ping\: {0}ms +text.fps = FPS: {0} +text.tps = TPS: {0} +text.ping = Ping: {0}ms text.language.restart = Please restart your game for the language settings to take effect. text.settings = Settings text.tutorial = Tutorial @@ -260,7 +261,7 @@ text.editor = Editor text.mapeditor = Map Editor text.donate = Donate -text.connectfail = [crimson]Failed to connect to server\:\n\n[accent]{0} +text.connectfail = [crimson]Failed to connect to server:\n\n[accent]{0} text.error.unreachable = Server unreachable.\nIs the address spelled correctly? 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! @@ -277,8 +278,8 @@ text.settings.game = Game text.settings.sound = Sound text.settings.graphics = Graphics 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.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 @@ -357,7 +358,7 @@ setting.difficulty.easy = easy setting.difficulty.normal = normal setting.difficulty.hard = hard setting.difficulty.insane = insane -setting.difficulty.name = Difficulty\: +setting.difficulty.name = Difficulty: setting.screenshake.name = Screen Shake setting.effects.name = Display Effects setting.sensitivity.name = Controller Sensitivity @@ -480,21 +481,21 @@ mech.trident-ship.weapon = Bomb Bay 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 -text.item.explosiveness = [LIGHT_GRAY]Explosiveness\: {0}% -text.item.flammability = [LIGHT_GRAY]Flammability\: {0}% -text.item.radioactivity = [LIGHT_GRAY]Radioactivity\: {0}% -text.item.fluxiness = [LIGHT_GRAY]Flux Power\: {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.liquid.heatcapacity = [LIGHT_GRAY]Heat Capacity\: {0} -text.liquid.viscosity = [LIGHT_GRAY]Viscosity\: {0} -text.liquid.temperature = [LIGHT_GRAY]Temperature\: {0} +text.item.explosiveness = [LIGHT_GRAY]Explosiveness: {0}% +text.item.flammability = [LIGHT_GRAY]Flammability: {0}% +text.item.radioactivity = [LIGHT_GRAY]Radioactivity: {0}% +text.item.fluxiness = [LIGHT_GRAY]Flux Power: {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.liquid.heatcapacity = [LIGHT_GRAY]Heat Capacity: {0} +text.liquid.viscosity = [LIGHT_GRAY]Viscosity: {0} +text.liquid.temperature = [LIGHT_GRAY]Temperature: {0} block.constructing = {0} [LIGHT_GRAY](Constructing) block.spawn.name = Enemy Spawn block.core.name = Core diff --git a/core/src/io/anuke/mindustry/ai/Pathfinder.java b/core/src/io/anuke/mindustry/ai/Pathfinder.java index 7f9c77970c..ccb9fc6fc4 100644 --- a/core/src/io/anuke/mindustry/ai/Pathfinder.java +++ b/core/src/io/anuke/mindustry/ai/Pathfinder.java @@ -182,7 +182,7 @@ public class Pathfinder{ } } - state.spawner.checkAllQuadrants(); + world.spawner.checkAllQuadrants(); } class PathData{ diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index 075c7e1688..90b87f56e1 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -89,7 +89,7 @@ public class Control extends Module{ "color-1", Color.rgba8888(playerColors[11]), "color-2", Color.rgba8888(playerColors[13]), "color-3", Color.rgba8888(playerColors[9]), - "name", "player", + "name", "", "lastBuild", 0 ); diff --git a/core/src/io/anuke/mindustry/core/GameState.java b/core/src/io/anuke/mindustry/core/GameState.java index bde128eb91..96a36fad8a 100644 --- a/core/src/io/anuke/mindustry/core/GameState.java +++ b/core/src/io/anuke/mindustry/core/GameState.java @@ -1,6 +1,5 @@ package io.anuke.mindustry.core; -import io.anuke.mindustry.ai.WaveSpawner; import io.anuke.mindustry.game.Difficulty; import io.anuke.mindustry.game.EventType.StateChangeEvent; import io.anuke.mindustry.game.GameMode; @@ -12,14 +11,21 @@ import static io.anuke.mindustry.Vars.unitGroups; import static io.anuke.mindustry.Vars.waveTeam; public class GameState{ + /**Current wave number, can be anything in non-wave modes.*/ public int wave = 1; + /**Wave countdown in ticks.*/ public float wavetime; + /**Whether the game is in game over state.*/ public boolean gameOver = false; + /**The current game mode.*/ public GameMode mode = GameMode.waves; + /**The current difficulty for wave modes.*/ public Difficulty difficulty = Difficulty.normal; - public WaveSpawner spawner = new WaveSpawner(); + /**Team data. Gets reset every new game.*/ public Teams teams = new Teams(); + /**Number of enemies in the game; only used clientside in servers.*/ public int enemies; + /**Current game state.*/ private State state = State.menu; public int enemies(){ diff --git a/core/src/io/anuke/mindustry/core/Logic.java b/core/src/io/anuke/mindustry/core/Logic.java index 5063a29b0b..5f7035cb7e 100644 --- a/core/src/io/anuke/mindustry/core/Logic.java +++ b/core/src/io/anuke/mindustry/core/Logic.java @@ -93,7 +93,7 @@ public class Logic extends Module{ } public void runWave(){ - state.spawner.spawnEnemies(); + world.spawner.spawnEnemies(); state.wave++; state.wavetime = wavespace * state.difficulty.timeScaling; diff --git a/core/src/io/anuke/mindustry/core/World.java b/core/src/io/anuke/mindustry/core/World.java index 50469edacf..cf72719411 100644 --- a/core/src/io/anuke/mindustry/core/World.java +++ b/core/src/io/anuke/mindustry/core/World.java @@ -5,6 +5,7 @@ import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.ObjectMap; import io.anuke.mindustry.ai.BlockIndexer; import io.anuke.mindustry.ai.Pathfinder; +import io.anuke.mindustry.ai.WaveSpawner; import io.anuke.mindustry.content.blocks.Blocks; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.game.EventType.TileChangeEvent; @@ -30,6 +31,7 @@ public class World extends Module{ public final WorldGenerator generator = new WorldGenerator(); public final BlockIndexer indexer = new BlockIndexer(); public final Pathfinder pathfinder = new Pathfinder(); + public final WaveSpawner spawner = new WaveSpawner(); private Map currentMap; private Sector currentSector; diff --git a/core/src/io/anuke/mindustry/input/MobileInput.java b/core/src/io/anuke/mindustry/input/MobileInput.java index d48b71542b..20a942da00 100644 --- a/core/src/io/anuke/mindustry/input/MobileInput.java +++ b/core/src/io/anuke/mindustry/input/MobileInput.java @@ -528,7 +528,7 @@ public class MobileInput extends InputHandler implements GestureListener{ //ignore off-screen taps if(cursor == null || ui.hasMouse(x, y)) return false; - threads.run(() -> checkTargets(worldx, worldy)); + checkTargets(worldx, worldy); //remove if request present if(hasRequest(cursor)){ @@ -548,14 +548,13 @@ public class MobileInput extends InputHandler implements GestureListener{ consumed = true; player.dropCarry(); //drop off unit }else{ - threads.run(() -> { - Unit unit = Units.getClosest(player.getTeam(), Graphics.world(x, y).x, Graphics.world(x, y).y, 4f, u -> !u.isFlying() && u.getMass() <= player.mech.carryWeight); + Unit unit = Units.getClosest(player.getTeam(), Graphics.world(x, y).x, Graphics.world(x, y).y, 4f, u -> !u.isFlying() && u.getMass() <= player.mech.carryWeight); - if(unit != null){ - player.moveTarget = unit; - Effects.effect(Fx.select, unit.getX(), unit.getY()); - } - }); + if(unit != null){ + consumed = true; + player.moveTarget = unit; + Effects.effect(Fx.select, unit.getX(), unit.getY()); + } } } diff --git a/core/src/io/anuke/mindustry/io/versions/Save16.java b/core/src/io/anuke/mindustry/io/versions/Save16.java index 3431873465..3dd485c41f 100644 --- a/core/src/io/anuke/mindustry/io/versions/Save16.java +++ b/core/src/io/anuke/mindustry/io/versions/Save16.java @@ -45,7 +45,7 @@ public class Save16 extends SaveFileVersion{ content.setTemporaryMapper(readContentHeader(stream)); - state.spawner.read(stream); + world.spawner.read(stream); readEntities(stream); @@ -71,7 +71,7 @@ public class Save16 extends SaveFileVersion{ writeContentHeader(stream); - state.spawner.write(stream); //spawnes + world.spawner.write(stream); //spawnes //--ENTITIES-- diff --git a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java index d0ce1a574b..b5b0051ac1 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java @@ -285,6 +285,11 @@ public class JoinDialog extends FloatingDialog{ } void connect(String ip, int port){ + if(Settings.getString("name").trim().isEmpty()){ + ui.showInfo("$text.noname"); + return; + } + ui.loadfrag.show("$text.connecting"); ui.loadfrag.setButton(() -> { diff --git a/tests/src/test/java/SectorTests.java b/tests/src/test/java/SectorTests.java index 3aae6cb305..bb07bc2743 100644 --- a/tests/src/test/java/SectorTests.java +++ b/tests/src/test/java/SectorTests.java @@ -46,7 +46,7 @@ public class SectorTests{ * This is achieved by adding at least one mission which defines a spawn point. */ @Test - void test_sectorHasACore(){ + void sectorHasACore(){ for(SectorPresets.SectorPreset preset : this.presets.getPresets().values()){ assertTrue(spawnPointIsDefined(preset.missions), "Sector at (" + preset.x + "|" + preset.y + ") contains no missions which define a spawn point. Add a battle or wave mission."); } From 1baf3190cd48c7b04f5e3eccc49b029ea72ae384 Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 23 Nov 2018 13:35:16 -0500 Subject: [PATCH 20/32] Host dialog name selection --- core/assets/bundles/bundle.properties | 4 ++-- core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index da381f256a..b1aa0d6fb9 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -70,8 +70,8 @@ text.continue = Continue text.nextmission = Next Mission text.maps.none = [LIGHT_GRAY]No maps found! text.about.button = About -text.name = Player Name: -text.noname = Pick a[accent] player name[] before connecting. +text.name = Name: +text.noname = Pick in a[accent] player name[] first. text.filename = File Name: text.unlocked = New Block Unlocked! text.unlocked.plural = New Blocks Unlocked! diff --git a/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java index 077cd57de9..06aa5f165f 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java @@ -50,6 +50,11 @@ public class HostDialog extends FloatingDialog{ content().add().width(65f); content().addButton("$text.host", () -> { + if(Settings.getString("name").trim().isEmpty()){ + ui.showInfo("$text.noname"); + return; + } + ui.loadfrag.show("$text.hosting"); Timers.runTask(5f, () -> { try{ From 6f5df6a671aa6d378eda24156e74bb7f9ead0632 Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 23 Nov 2018 14:30:58 -0500 Subject: [PATCH 21/32] Added list of contributors to credits --- core/assets/bundles/bundle.properties | 3 +- core/src/io/anuke/mindustry/Vars.java | 1 + .../io/anuke/mindustry/io/Contributors.java | 43 +++++++++++++++++++ .../mindustry/ui/dialogs/AboutDialog.java | 26 ++++++++++- 4 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 core/src/io/anuke/mindustry/io/Contributors.java diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index b1aa0d6fb9..29103baeea 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -1,5 +1,6 @@ -text.credits.text = Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GRAY](In case you can't tell, this text is currently unfinished.\nTranslators, don't edit it yet!) +text.credits.text = Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] text.credits = Credits +text.contributors = Translators and Contributors text.discord = Join the mindustry discord! text.link.discord.description = The official Mindustry discord chatroom text.link.github.description = Game source code diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index 399f5c3090..aebb84ee34 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -33,6 +33,7 @@ public class Vars{ public static final String appName = "Mindustry"; public static final String discordURL = "https://discord.gg/mindustry"; public static final String releasesURL = "https://api.github.com/repos/Anuken/Mindustry/releases"; + public static final String contributorsURL = "https://api.github.com/repos/Anuken/Mindustry/contributors"; public static final String crashReportURL = "http://mindustry.us.to/report"; //time between waves in frames (on normal mode) public static final float wavespace = 60 * 60 * 1.5f; diff --git a/core/src/io/anuke/mindustry/io/Contributors.java b/core/src/io/anuke/mindustry/io/Contributors.java new file mode 100644 index 0000000000..f7c6e0f4b1 --- /dev/null +++ b/core/src/io/anuke/mindustry/io/Contributors.java @@ -0,0 +1,43 @@ +package io.anuke.mindustry.io; + +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.JsonReader; +import com.badlogic.gdx.utils.JsonValue; +import io.anuke.mindustry.net.Net; +import io.anuke.ucore.function.Consumer; + +import static io.anuke.mindustry.Vars.contributorsURL; + +public class Contributors{ + + public static void getContributors(Consumer> success, Consumer fail){ + Net.http(contributorsURL, "GET", result -> { + JsonReader reader = new JsonReader(); + JsonValue value = reader.parse(result).child; + Array out = new Array<>(); + + while(value != null){ + String login = value.getString("login"); + out.add(new Contributor(login)); + value = value.next; + } + + success.accept(out); + }, fail); + } + + public static class Contributor{ + public final String login; + + public Contributor(String login){ + this.login = login; + } + + @Override + public String toString(){ + return "Contributor{" + + "login='" + login + '\'' + + '}'; + } + } +} diff --git a/core/src/io/anuke/mindustry/ui/dialogs/AboutDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/AboutDialog.java index e4d2324560..3b27bcc252 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/AboutDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/AboutDialog.java @@ -2,7 +2,11 @@ package io.anuke.mindustry.ui.dialogs; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.ObjectSet; +import io.anuke.mindustry.graphics.Palette; +import io.anuke.mindustry.io.Contributors; +import io.anuke.mindustry.io.Contributors.Contributor; import io.anuke.mindustry.ui.Links; import io.anuke.mindustry.ui.Links.LinkEntry; import io.anuke.ucore.core.Core; @@ -18,11 +22,14 @@ import static io.anuke.mindustry.Vars.ios; import static io.anuke.mindustry.Vars.ui; public class AboutDialog extends FloatingDialog{ + private Array contributors = new Array<>(); private static ObjectSet bannedItems = ObjectSet.with("google-play", "itch.io", "dev-builds", "trello"); public AboutDialog(){ super("$text.about.button"); + Contributors.getContributors(out -> contributors = out, Throwable::printStackTrace); + shown(this::setup); onResize(this::setup); } @@ -94,7 +101,24 @@ public class AboutDialog extends FloatingDialog{ public void showCredits(){ FloatingDialog dialog = new FloatingDialog("$text.credits"); dialog.addCloseButton(); - dialog.content().labelWrap("$text.credits.text").width(400f); + dialog.content().add("$text.credits.text"); + dialog.content().row(); + if(!contributors.isEmpty()){ + dialog.content().addImage("blank").color(Palette.accent).fillX().height(3f).pad(3f); + dialog.content().row(); + dialog.content().add("$text.contributors"); + dialog.content().row(); + dialog.content().pane("clear", new Table(){{ + int i = 0; + left(); + for(Contributor c : contributors){ + add("[lightgray]" + c.login).left().pad(3).padLeft(6).padRight(6); + if(++i % 3 == 0){ + row(); + } + } + }}); + } dialog.show(); } } From 6bfd57097f9aa6bf44fef12d603cb7f8109e40ca Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 24 Nov 2018 08:21:22 -0500 Subject: [PATCH 22/32] Cleanup of TODOs --- android/src/io/anuke/mindustry/DonationsActivity.java | 1 - core/src/io/anuke/mindustry/ai/BlockIndexer.java | 1 - core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java | 1 - core/src/io/anuke/mindustry/editor/MapView.java | 2 -- core/src/io/anuke/mindustry/entities/units/UnitType.java | 1 - core/src/io/anuke/mindustry/maps/TutorialSector.java | 2 +- core/src/io/anuke/mindustry/maps/generation/Generation.java | 1 - core/src/io/anuke/mindustry/type/Mech.java | 1 - core/src/io/anuke/mindustry/world/Block.java | 1 - .../io/anuke/mindustry/world/blocks/distribution/Sorter.java | 2 -- .../io/anuke/mindustry/world/blocks/production/Cultivator.java | 2 +- 11 files changed, 2 insertions(+), 13 deletions(-) diff --git a/android/src/io/anuke/mindustry/DonationsActivity.java b/android/src/io/anuke/mindustry/DonationsActivity.java index 0a868f8ed3..09b6a6b12f 100644 --- a/android/src/io/anuke/mindustry/DonationsActivity.java +++ b/android/src/io/anuke/mindustry/DonationsActivity.java @@ -68,7 +68,6 @@ public class DonationsActivity extends FragmentActivity{ Fragment fragment = fragmentManager.findFragmentByTag("donationsFragment"); if(fragment != null){ fragment.onActivityResult(requestCode, resultCode, data); - //TODO donation event, set settings? } } } diff --git a/core/src/io/anuke/mindustry/ai/BlockIndexer.java b/core/src/io/anuke/mindustry/ai/BlockIndexer.java index 04c5c04cb8..9b0c5f7bac 100644 --- a/core/src/io/anuke/mindustry/ai/BlockIndexer.java +++ b/core/src/io/anuke/mindustry/ai/BlockIndexer.java @@ -21,7 +21,6 @@ import io.anuke.ucore.util.ThreadArray; import static io.anuke.mindustry.Vars.*; //TODO consider using quadtrees for finding specific types of blocks within an area -//TODO maybe use Arrays instead of ObjectSets? /**Class used for indexing special target blocks for AI.*/ @SuppressWarnings("unchecked") diff --git a/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java b/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java index 7307ae5a6f..9b15b070ce 100644 --- a/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java @@ -205,7 +205,6 @@ public class TurretBlocks extends BlockList implements ContentList{ }}; fuse = new ItemTurret("fuse"){{ - //TODO make it use power ammoTypes = new AmmoType[]{AmmoTypes.fuseShotgun}; reload = 50f; shootShake = 4f; diff --git a/core/src/io/anuke/mindustry/editor/MapView.java b/core/src/io/anuke/mindustry/editor/MapView.java index 59894bd016..fca223c3fe 100644 --- a/core/src/io/anuke/mindustry/editor/MapView.java +++ b/core/src/io/anuke/mindustry/editor/MapView.java @@ -175,7 +175,6 @@ public class MapView extends Element implements GestureListener{ public void clearStack(){ stack.clear(); - //TODO clear und obuffer } public OperationStack getStack(){ @@ -292,7 +291,6 @@ public class MapView extends Element implements GestureListener{ } } - //todo is it really math.max? float scaling = zoom * Math.min(width, height) / editor.getMap().width(); Draw.color(Palette.accent); diff --git a/core/src/io/anuke/mindustry/entities/units/UnitType.java b/core/src/io/anuke/mindustry/entities/units/UnitType.java index 5087df0b81..6cae81a48f 100644 --- a/core/src/io/anuke/mindustry/entities/units/UnitType.java +++ b/core/src/io/anuke/mindustry/entities/units/UnitType.java @@ -19,7 +19,6 @@ import io.anuke.ucore.util.Bundles; import io.anuke.ucore.util.Log; import io.anuke.ucore.util.Strings; -//TODO merge unit type with mech public class UnitType extends UnlockableContent{ protected final Supplier constructor; diff --git a/core/src/io/anuke/mindustry/maps/TutorialSector.java b/core/src/io/anuke/mindustry/maps/TutorialSector.java index f88dbbabc9..b597cc9ec0 100644 --- a/core/src/io/anuke/mindustry/maps/TutorialSector.java +++ b/core/src/io/anuke/mindustry/maps/TutorialSector.java @@ -30,7 +30,7 @@ public class TutorialSector{ new ItemMission(Items.copper, 100).setMessage("$tutorial.morecopper"), new BlockMission(TurretBlocks.duo).setMessage("$tutorial.turret"), - //TODO fill turret with items mission + / //new BlockMission(ProductionBlocks.mechanicalDrill).setMessage("$tutorial.drillturret"), // Create a wave mission which spawns the core at 60, 60 rather than in the center of the map diff --git a/core/src/io/anuke/mindustry/maps/generation/Generation.java b/core/src/io/anuke/mindustry/maps/generation/Generation.java index 076815e0f9..3929a160ad 100644 --- a/core/src/io/anuke/mindustry/maps/generation/Generation.java +++ b/core/src/io/anuke/mindustry/maps/generation/Generation.java @@ -30,7 +30,6 @@ public class Generation{ return tiles[x][y]; } - //TODO implement Item drillItem(int x, int y, Drill block){ if(block.isMultiblock()){ Item result = null; diff --git a/core/src/io/anuke/mindustry/type/Mech.java b/core/src/io/anuke/mindustry/type/Mech.java index 007435cde1..f075f1c2e1 100644 --- a/core/src/io/anuke/mindustry/type/Mech.java +++ b/core/src/io/anuke/mindustry/type/Mech.java @@ -11,7 +11,6 @@ import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.ucore.util.Bundles; -//TODO merge unit type with mech public class Mech extends UnlockableContent{ public final String name; public final String description; diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java index 093d9b77de..6530d5228a 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -335,7 +335,6 @@ public class Block extends BaseBlock { if(hasItems) stats.add(BlockStat.itemCapacity, itemCapacity, StatUnit.items); } - //TODO make this easier to config. public void setBars(){ if(hasPower) bars.add(new BlockBar(BarType.power, true, tile -> tile.entity.power.amount / powerCapacity)); if(hasLiquids) 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 f9da9999b8..e99769ffd6 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java @@ -45,8 +45,6 @@ public class Sorter extends Block implements SelectionTrait{ public void draw(Tile tile){ super.draw(tile); - //TODO call event for change - SorterEntity entity = tile.entity(); Draw.color(entity.sortItem.color); 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 e2854906dd..69abb7d4c2 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java @@ -42,7 +42,7 @@ public class Cultivator extends Drill{ stats.remove(BlockStat.drillTier); stats.add(BlockStat.drillTier, table -> { table.addImage("grass1").size(8 * 3).padBottom(3).padTop(3); - // TODO: find out localized name and add tool tip + table.add(Blocks.grass.formalName).padLeft(3); }); } From ec80fc9f3f3a4780dd3b6f83f84be3c8e02daab6 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 24 Nov 2018 19:39:35 -0500 Subject: [PATCH 23/32] Android build update --- android/AndroidManifest.xml | 2 +- android/build.gradle | 2 +- core/src/io/anuke/mindustry/core/NetServer.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index b0e4475812..8fdb041fc7 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -20,7 +20,7 @@ diff --git a/android/build.gradle b/android/build.gradle index e7790fb299..eecd23ce01 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -93,7 +93,7 @@ android { applicationId "io.anuke.mindustry" minSdkVersion 14 - targetSdkVersion 27 + targetSdkVersion 28 versionCode code versionName versionNameResult } diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index 25ee6de9a4..e0fd8df64b 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -120,7 +120,7 @@ public class NetServer extends Module{ return; } - if(packet.version == -1 && Version.build != -1 && !admins.allowsCustomClients()){ + if((packet.version == -1 || !packet.versionType.equals("official")) && Version.build != -1 && !admins.allowsCustomClients()){ kick(id, KickReason.customClient); return; } From c32140241422425f8ccb4e81f27c53215ca34775 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 24 Nov 2018 20:04:20 -0500 Subject: [PATCH 24/32] Various bugfixes --- core/assets/bundles/bundle.properties | 2 +- core/src/io/anuke/mindustry/core/NetClient.java | 2 ++ core/src/io/anuke/mindustry/core/NetServer.java | 2 +- core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java | 1 - core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java | 1 - 5 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 29103baeea..29a8ff14a0 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -72,7 +72,7 @@ text.nextmission = Next Mission text.maps.none = [LIGHT_GRAY]No maps found! text.about.button = About text.name = Name: -text.noname = Pick in a[accent] player name[] first. +text.noname = Pick a[accent] player name[] first. text.filename = File Name: text.unlocked = New Block Unlocked! text.unlocked.plural = New Blocks Unlocked! diff --git a/core/src/io/anuke/mindustry/core/NetClient.java b/core/src/io/anuke/mindustry/core/NetClient.java index 99a224da9b..bf124f9be2 100644 --- a/core/src/io/anuke/mindustry/core/NetClient.java +++ b/core/src/io/anuke/mindustry/core/NetClient.java @@ -15,6 +15,7 @@ import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.traits.BuilderTrait.BuildRequest; import io.anuke.mindustry.entities.traits.SyncTrait; import io.anuke.mindustry.entities.traits.TypeTrait; +import io.anuke.mindustry.game.Version; import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.gen.RemoteReadClient; import io.anuke.mindustry.net.Net; @@ -95,6 +96,7 @@ public class NetClient extends Module{ ConnectPacket c = new ConnectPacket(); c.name = player.name; c.mobile = mobile; + c.versionType = Version.type; c.color = Color.rgba8888(player.color); c.usid = getUsid(packet.addressTCP); c.uuid = Platform.instance.getUUID(); diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index e0fd8df64b..b3bd83af65 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -120,7 +120,7 @@ public class NetServer extends Module{ return; } - if((packet.version == -1 || !packet.versionType.equals("official")) && Version.build != -1 && !admins.allowsCustomClients()){ + if(packet.versionType == null || ((packet.version == -1 || !packet.versionType.equals("official")) && Version.build != -1 && !admins.allowsCustomClients())){ kick(id, KickReason.customClient); return; } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java index 06aa5f165f..2c9bf76d3b 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java @@ -28,7 +28,6 @@ public class HostDialog extends FloatingDialog{ content().table(t -> { t.add("$text.name").padRight(10); t.addField(Settings.getString("name"), text -> { - if(text.isEmpty()) return; player.name = text; Settings.put("name", text); Settings.save(); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java index b5b0051ac1..d844d18c5d 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java @@ -205,7 +205,6 @@ public class JoinDialog extends FloatingDialog{ content().table(t -> { t.add("$text.name").padRight(10); t.addField(Settings.getString("name"), text -> { - if(text.isEmpty()) return; player.name = text; Settings.put("name", text); Settings.save(); From bb6a7481677773343988779b444f400c58b20cfd Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 25 Nov 2018 10:29:38 -0500 Subject: [PATCH 25/32] Various bugfixes --- core/assets/bundles/bundle.properties | 2 +- .../content/blocks/TurretBlocks.java | 4 ++-- .../io/anuke/mindustry/core/NetServer.java | 5 +++++ .../io/anuke/mindustry/editor/EditorTool.java | 2 ++ .../io/anuke/mindustry/input/MobileInput.java | 2 +- .../maps/generation/WorldGenerator.java | 19 +++++++++++++++++++ core/src/io/anuke/mindustry/net/Net.java | 5 +++-- core/src/io/anuke/mindustry/world/Block.java | 2 +- .../world/blocks/defense/MendProjector.java | 5 ++++- .../blocks/defense/OverdriveProjector.java | 8 ++++++-- 10 files changed, 44 insertions(+), 10 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 29a8ff14a0..cd3cf7d7ed 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -464,7 +464,7 @@ mech.delta-mech.description = A fast, lightly-armored mech made for hit-and-run 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.description = The support mech. Heals allied blocks by shooting at them. Can heal allies in a radius with its repair ability. mech.omega-mech.name = Omega mech.omega-mech.weapon = Swarm Missiles mech.omega-mech.ability = Armored Configuration diff --git a/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java b/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java index 9b15b070ce..b6a60d8d1f 100644 --- a/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java @@ -106,7 +106,7 @@ public class TurretBlocks extends BlockList implements ContentList{ arc = new PowerTurret("arc"){{ shootType = AmmoTypes.arc; - reload = 75f; + reload = 85f; shootShake = 1f; shootCone = 40f; rotatespeed = 8f; @@ -121,7 +121,7 @@ public class TurretBlocks extends BlockList implements ContentList{ swarmer = new BurstTurret("swarmer"){{ ammoTypes = new AmmoType[]{AmmoTypes.missileExplosive, AmmoTypes.missileIncindiary, AmmoTypes.missileSurge}; - reload = 5f; + reload = 50f; shots = 4; burstSpacing = 5; inaccuracy = 10f; diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index b3bd83af65..052e31bc8f 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -16,6 +16,7 @@ import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.traits.BuilderTrait.BuildRequest; import io.anuke.mindustry.entities.traits.SyncTrait; +import io.anuke.mindustry.game.EventType.WorldLoadEvent; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Version; import io.anuke.mindustry.gen.Call; @@ -24,6 +25,7 @@ import io.anuke.mindustry.net.*; import io.anuke.mindustry.net.Administration.PlayerInfo; import io.anuke.mindustry.net.Packets.*; import io.anuke.mindustry.world.Tile; +import io.anuke.ucore.core.Events; import io.anuke.ucore.core.Timers; import io.anuke.ucore.entities.Entities; import io.anuke.ucore.entities.EntityGroup; @@ -76,6 +78,9 @@ public class NetServer extends Module{ private DataOutputStream dataStream = new DataOutputStream(syncStream); public NetServer(){ + Events.on(WorldLoadEvent.class, event -> { + connections.clear(); + }); Net.handleServer(Connect.class, (id, connect) -> { if(admins.isIPBanned(connect.addressTCP)){ diff --git a/core/src/io/anuke/mindustry/editor/EditorTool.java b/core/src/io/anuke/mindustry/editor/EditorTool.java index c988beb46b..6eca7e8fd4 100644 --- a/core/src/io/anuke/mindustry/editor/EditorTool.java +++ b/core/src/io/anuke/mindustry/editor/EditorTool.java @@ -17,6 +17,8 @@ import static io.anuke.mindustry.Vars.ui; public enum EditorTool{ pick{ public void touched(MapEditor editor, int x, int y){ + if(!Structs.inBounds(x, y, editor.getMap().width(), editor.getMap().height())) return; + byte bf = editor.getMap().read(x, y, DataPosition.floor); byte bw = editor.getMap().read(x, y, DataPosition.wall); byte link = editor.getMap().read(x, y, DataPosition.link); diff --git a/core/src/io/anuke/mindustry/input/MobileInput.java b/core/src/io/anuke/mindustry/input/MobileInput.java index 20a942da00..ea26deb6b0 100644 --- a/core/src/io/anuke/mindustry/input/MobileInput.java +++ b/core/src/io/anuke/mindustry/input/MobileInput.java @@ -230,7 +230,7 @@ public class MobileInput extends InputHandler implements GestureListener{ player.clearBuilding(); mode = none; recipe = null; - }).visible(() -> player.isBuilding() || recipe != null); + }).visible(() -> player.isBuilding() || recipe != null || mode == breaking); //confirm button table.addImageButton("icon-check", "clear-partial", 16 * 2f, () -> { diff --git a/core/src/io/anuke/mindustry/maps/generation/WorldGenerator.java b/core/src/io/anuke/mindustry/maps/generation/WorldGenerator.java index 45e0c64bcf..db95af39f7 100644 --- a/core/src/io/anuke/mindustry/maps/generation/WorldGenerator.java +++ b/core/src/io/anuke/mindustry/maps/generation/WorldGenerator.java @@ -172,6 +172,25 @@ public class WorldGenerator{ prepareTiles(tiles); + for(int x = 0; x < width; x++){ + for(int y = 0; y < height; y++){ + Tile tile = tiles[x][y]; + + byte elevation = tile.getElevation(); + + for(GridPoint2 point : Geometry.d4){ + if(!Structs.inBounds(x + point.x, y + point.y, width, height)) continue; + if(tiles[x + point.x][y + point.y].getElevation() < elevation){ + + if(sim2.octaveNoise2D(1, 1, 1.0 / 8, x, y) > 0.8){ + tile.setElevation(-1); + } + break; + } + } + } + } + world.setBlock(tiles[spawns.get(0).x][spawns.get(0).y], StorageBlocks.core, Team.blue); if(state.mode.isPvp){ diff --git a/core/src/io/anuke/mindustry/net/Net.java b/core/src/io/anuke/mindustry/net/Net.java index 0e152cb18e..bdf55a0888 100644 --- a/core/src/io/anuke/mindustry/net/Net.java +++ b/core/src/io/anuke/mindustry/net/Net.java @@ -356,12 +356,13 @@ public class Net{ Gdx.net.sendHttpRequest(req, new HttpResponseListener(){ @Override public void handleHttpResponse(HttpResponse httpResponse){ - listener.accept(httpResponse.getResultAsString()); + String result = httpResponse.getResultAsString(); + Gdx.app.postRunnable(() -> listener.accept(result)); } @Override public void failed(Throwable t){ - failure.accept(t); + Gdx.app.postRunnable(() -> failure.accept(t)); } @Override diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java index 6530d5228a..96ddfc2b94 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -153,7 +153,7 @@ public class Block extends BaseBlock { TileEntity entity = tile.entity(); for(Tile other : getPowerConnections(tile, tempTiles)){ - if(other.entity.power != null){ + if(other.entity.power != null && other.entity.power.graph != null){ other.entity.power.graph.add(entity.power.graph); } } 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 1119cf311f..997c821de9 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java @@ -95,8 +95,11 @@ public class MendProjector extends Block{ @Override public void drawSelect(Tile tile){ + MendEntity entity = tile.entity(); + float realRange = range + entity.phaseHeat * phaseRangeBoost; + Draw.color(color); - Lines.dashCircle(tile.drawx(), tile.drawy() - 1f, range); + Lines.dashCircle(tile.drawx(), tile.drawy(), realRange); Draw.color(); } 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 cb340d1e40..615a6fa5a8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java @@ -36,6 +36,7 @@ public class OverdriveProjector extends Block{ protected float speedBoost = 1.5f; protected float speedBoostPhase = 0.75f; protected float useTime = 400f; + protected float phaseRangeBoost = 20f; public OverdriveProjector(String name){ super(name); @@ -66,7 +67,7 @@ public class OverdriveProjector extends Block{ } if(entity.charge >= reload){ - float realRange = range + entity.phaseHeat * 20f; + float realRange = range + entity.phaseHeat * phaseRangeBoost; float realBoost = speedBoost + entity.phaseHeat*speedBoostPhase; Effects.effect(BlockFx.overdriveWave, Hue.mix(color, phase, entity.phaseHeat), tile.drawx(), tile.drawy(), realRange); @@ -97,8 +98,11 @@ public class OverdriveProjector extends Block{ @Override public void drawSelect(Tile tile){ + OverdriveEntity entity = tile.entity(); + float realRange = range + entity.phaseHeat * phaseRangeBoost; + Draw.color(color); - Lines.dashCircle(tile.drawx(), tile.drawy() - 1f, range); + Lines.dashCircle(tile.drawx(), tile.drawy(), realRange); Draw.color(); } From 44897fb3715029fbbf9c3551a8931e4b0f0e9d17 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 25 Nov 2018 13:58:19 -0500 Subject: [PATCH 26/32] Mobile chat fix / Turret balance / UI disable variable --- core/src/io/anuke/mindustry/Vars.java | 1 + .../content/blocks/TurretBlocks.java | 2 +- .../src/io/anuke/mindustry/core/Platform.java | 2 - core/src/io/anuke/mindustry/core/UI.java | 2 + .../mindustry/ui/fragments/ChatFragment.java | 41 +++++++++++++++---- 5 files changed, 36 insertions(+), 12 deletions(-) diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index aebb84ee34..ec2026897e 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -73,6 +73,7 @@ public class Vars{ }; //server port public static final int port = 6567; + public static boolean disableUI; public static boolean testMobile; //shorthand for whether or not this is running on android or ios public static boolean mobile; diff --git a/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java b/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java index b6a60d8d1f..a3a805a557 100644 --- a/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java @@ -110,7 +110,7 @@ public class TurretBlocks extends BlockList implements ContentList{ shootShake = 1f; shootCone = 40f; rotatespeed = 8f; - powerUsed = 9f; + powerUsed = 10f; powerCapacity = 30f; range = 150f; shootEffect = ShootFx.lightningShoot; diff --git a/core/src/io/anuke/mindustry/core/Platform.java b/core/src/io/anuke/mindustry/core/Platform.java index 63695bac48..6c184cca81 100644 --- a/core/src/io/anuke/mindustry/core/Platform.java +++ b/core/src/io/anuke/mindustry/core/Platform.java @@ -10,7 +10,6 @@ import io.anuke.ucore.core.Timers; import io.anuke.ucore.function.Consumer; import io.anuke.ucore.scene.ui.Dialog; import io.anuke.ucore.scene.ui.TextField; -import io.anuke.ucore.util.Log; import java.util.Random; @@ -29,7 +28,6 @@ public abstract class Platform { if(!mobile) return; //this is mobile only, desktop doesn't need dialogs field.tapped(() -> { - Log.info("yappd"); Dialog dialog = new Dialog("", "dialog"); dialog.setFillParent(true); dialog.content().top(); diff --git a/core/src/io/anuke/mindustry/core/UI.java b/core/src/io/anuke/mindustry/core/UI.java index 0d7ca96820..27e8fd3569 100644 --- a/core/src/io/anuke/mindustry/core/UI.java +++ b/core/src/io/anuke/mindustry/core/UI.java @@ -123,6 +123,8 @@ public class UI extends SceneModule{ @Override public void update(){ + if(disableUI) return; + if(Graphics.drawing()) Graphics.end(); act(); diff --git a/core/src/io/anuke/mindustry/ui/fragments/ChatFragment.java b/core/src/io/anuke/mindustry/ui/fragments/ChatFragment.java index 4788f98527..3d96883b34 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/ChatFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/ChatFragment.java @@ -1,5 +1,7 @@ package io.anuke.mindustry.ui.fragments; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Input.Keys; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.graphics.g2d.BitmapFont; @@ -8,13 +10,13 @@ import com.badlogic.gdx.utils.Align; import com.badlogic.gdx.utils.Array; import io.anuke.mindustry.Vars; import io.anuke.mindustry.core.GameState.State; -import io.anuke.mindustry.core.Platform; import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.net.Net; import io.anuke.ucore.core.Core; import io.anuke.ucore.core.Inputs; import io.anuke.ucore.core.Timers; import io.anuke.ucore.scene.Group; +import io.anuke.ucore.scene.ui.Dialog; import io.anuke.ucore.scene.ui.Label; import io.anuke.ucore.scene.ui.Label.LabelStyle; import io.anuke.ucore.scene.ui.TextField; @@ -22,8 +24,7 @@ import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.ucore.scene.ui.layout.Unit; import io.anuke.ucore.util.Mathf; -import static io.anuke.mindustry.Vars.players; -import static io.anuke.mindustry.Vars.state; +import static io.anuke.mindustry.Vars.*; import static io.anuke.ucore.core.Core.scene; import static io.anuke.ucore.core.Core.skin; @@ -113,9 +114,35 @@ public class ChatFragment extends Table{ chatfield.getStyle().font = skin.getFont("default-font-chat"); chatfield.getStyle().fontColor = Color.WHITE; chatfield.setStyle(chatfield.getStyle()); - Platform.instance.addDialog(chatfield, Vars.maxTextLength); - bottom().left().marginBottom(offsety).marginLeft(offsetx * 2).add(fieldlabel).padBottom(4f); + if(mobile){ + chatfield.tapped(() -> { + Dialog dialog = new Dialog("", "dialog"); + dialog.setFillParent(true); + dialog.content().top(); + dialog.content().defaults().height(65f); + TextField to = dialog.content().addField("", t-> {}).pad(15).width(250f).get(); + to.setMaxLength(maxTextLength); + to.keyDown(Keys.ENTER, () -> dialog.content().find("okb").fireClick()); + dialog.content().addButton("$text.ok", () -> { + chatfield.clearText(); + chatfield.appendText(to.getText()); + chatfield.change(); + dialog.hide(); + Gdx.input.setOnscreenKeyboardVisible(false); + toggle(); + }).width(90f).name("okb"); + + dialog.show(); + Timers.runTask(1f, () -> { + to.setCursorPosition(to.getText().length()); + Core.scene.setKeyboardFocus(to); + Gdx.input.setOnscreenKeyboardVisible(true); + }); + }); + } + + bottom().left().marginBottom(offsety).marginLeft(offsetx * 2).add(fieldlabel).padBottom(6f); add(chatfield).padBottom(offsety).padLeft(offsetx).growX().padRight(offsetx).height(28); @@ -123,10 +150,6 @@ public class ChatFragment extends Table{ marginBottom(105f); marginRight(240f); } - - if(Vars.mobile){ - addImageButton("icon-arrow-right", 14 * 2, this::toggle).size(46f, 51f).visible(() -> chatOpen).pad(2f); - } } @Override From a7f7a09418417436e84e69a26b954ec7334f8127 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 25 Nov 2018 16:34:31 -0500 Subject: [PATCH 27/32] Drone repair cleanup / Percentage-based repair --- .../io/anuke/mindustry/content/UnitTypes.java | 1 + .../io/anuke/mindustry/content/Weapons.java | 12 +++- .../content/bullets/TurretBullets.java | 11 +++- .../mindustry/entities/bullet/Bullet.java | 2 +- .../mindustry/entities/bullet/BulletType.java | 4 ++ .../entities/traits/RepairTrait.java | 19 ------ .../mindustry/entities/units/types/Drone.java | 42 ++------------ .../world/blocks/defense/MendingWall.java | 58 ------------------- 8 files changed, 29 insertions(+), 120 deletions(-) delete mode 100644 core/src/io/anuke/mindustry/entities/traits/RepairTrait.java delete mode 100644 core/src/io/anuke/mindustry/world/blocks/defense/MendingWall.java diff --git a/core/src/io/anuke/mindustry/content/UnitTypes.java b/core/src/io/anuke/mindustry/content/UnitTypes.java index 33b4a7cacf..16f630433c 100644 --- a/core/src/io/anuke/mindustry/content/UnitTypes.java +++ b/core/src/io/anuke/mindustry/content/UnitTypes.java @@ -37,6 +37,7 @@ public class UnitTypes implements ContentList{ }; spirit = new UnitType("spirit", Spirit.class, Spirit::new){{ + weapon = Weapons.healBlasterDrone; isFlying = true; drag = 0.01f; speed = 0.2f; diff --git a/core/src/io/anuke/mindustry/content/Weapons.java b/core/src/io/anuke/mindustry/content/Weapons.java index f37796ba13..6875f4d392 100644 --- a/core/src/io/anuke/mindustry/content/Weapons.java +++ b/core/src/io/anuke/mindustry/content/Weapons.java @@ -7,7 +7,7 @@ import io.anuke.mindustry.type.ContentType; import io.anuke.mindustry.type.Weapon; public class Weapons implements ContentList{ - public static Weapon blaster, blasterSmall, glaiveBlaster, droneBlaster, healBlaster, chainBlaster, shockgun, + public static Weapon blaster, blasterSmall, glaiveBlaster, droneBlaster, healBlaster, healBlasterDrone, chainBlaster, shockgun, sapper, swarmer, bomber, bomberTrident, flakgun, flamethrower, missiles, artillery, laserBurster; @Override @@ -169,6 +169,16 @@ public class Weapons implements ContentList{ ejectEffect = Fx.none; ammo = AmmoTypes.lancerLaser; }}; + + healBlasterDrone = new Weapon("heal-blaster"){{ + length = 1.5f; + reload = 40f; + width = 0.5f; + roundrobin = true; + ejectEffect = Fx.none; + recoil = 2f; + ammo = AmmoTypes.healBlaster; + }}; } @Override diff --git a/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java b/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java index addcb75960..2b28ec0016 100644 --- a/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java +++ b/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java @@ -43,7 +43,7 @@ public class TurretBullets extends BulletList implements ContentList{ }; healBullet = new BulletType(5.2f, 13){ - float healAmount = 21f; + float healPercent = 3f; { hiteffect = BulletFx.hitLaser; @@ -51,6 +51,11 @@ public class TurretBullets extends BulletList implements ContentList{ collidesTeam = true; } + @Override + public boolean collides(Bullet b, Tile tile){ + return tile.getTeam() != b.getTeam() || tile.entity.healthf() < 1f; + } + @Override public void draw(Bullet b){ Draw.color(Palette.heal); @@ -67,8 +72,8 @@ public class TurretBullets extends BulletList implements ContentList{ tile = tile.target(); if(tile.getTeam() == b.getTeam() && !(tile.block() instanceof BuildBlock)){ - Effects.effect(BlockFx.healBlock, tile.drawx(), tile.drawy(), tile.block().size); - tile.entity.healBy(healAmount); + Effects.effect(BlockFx.healBlockFull, Palette.heal, tile.drawx(), tile.drawy(), tile.block().size); + tile.entity.healBy(healPercent / 100f * tile.entity.maxHealth()); } } }; diff --git a/core/src/io/anuke/mindustry/entities/bullet/Bullet.java b/core/src/io/anuke/mindustry/entities/bullet/Bullet.java index f3d60b86f6..f918d6ce8b 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/Bullet.java +++ b/core/src/io/anuke/mindustry/entities/bullet/Bullet.java @@ -209,7 +209,7 @@ public class Bullet extends BulletEntity implements TeamTrait, SyncT if(tile == null) return false; tile = tile.target(); - if(tile.entity != null && tile.entity.collide(this) && !tile.entity.isDead() && (type.collidesTeam || tile.getTeam() != team)){ + if(tile.entity != null && tile.entity.collide(this) && type.collides(this, tile) && !tile.entity.isDead() && (type.collidesTeam || tile.getTeam() != team)){ if(tile.getTeam() != team){ tile.entity.collision(this); } diff --git a/core/src/io/anuke/mindustry/entities/bullet/BulletType.java b/core/src/io/anuke/mindustry/entities/bullet/BulletType.java index 916ebbb52c..b6220dd9dd 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/BulletType.java +++ b/core/src/io/anuke/mindustry/entities/bullet/BulletType.java @@ -55,6 +55,10 @@ public abstract class BulletType extends Content implements BaseBulletType type.range){ circle(type.range*0.9f); }else{ - TileEntity entity = (TileEntity) target; - entity.healBy(type.healSpeed * entity.tile.block().health / 100f * Timers.delta()); - - if(timer.get(timerRepairEffect, 30)){ - Effects.effect(BlockFx.healBlockFull, Palette.heal, entity.x, entity.y, entity.tile.block().size); - } + getWeapon().update(Drone.this, target.getX(), target.getY()); } } }, @@ -317,16 +306,6 @@ public class Drone extends FlyingUnit implements BuilderTrait{ target = null; } - if(Net.client() && state.is(repair) && target instanceof TileEntity && target.distanceTo(this) < type.range){ - TileEntity entity = (TileEntity) target; - entity.health += type.healSpeed * Timers.delta(); - entity.health = Mathf.clamp(entity.health, 0, entity.tile.block().health); - - if(timer.get(timerRepairEffect, 30)){ - Effects.effect(BlockFx.healBlockFull, Palette.heal, entity.x, entity.y, entity.tile.block().size); - } - } - updateBuilding(this); } @@ -355,19 +334,6 @@ public class Drone extends FlyingUnit implements BuilderTrait{ @Override public void drawOver(){ trail.draw(Palette.lightTrail, 3f); - - TargetTrait entity = target; - - if(entity instanceof TileEntity && state.is(repair) && target.distanceTo(this) < type.range){ - float len = 5f; - Draw.color(Color.BLACK, Color.WHITE, 0.95f + Mathf.absin(Timers.time(), 0.8f, 0.05f)); - Shapes.laser("beam", "beam-end", - x + Angles.trnsx(rotation, len), - y + Angles.trnsy(rotation, len), - entity.getX(), entity.getY()); - Draw.color(); - } - drawBuilding(this); } diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/MendingWall.java b/core/src/io/anuke/mindustry/world/blocks/defense/MendingWall.java deleted file mode 100644 index aabcbcd8ef..0000000000 --- a/core/src/io/anuke/mindustry/world/blocks/defense/MendingWall.java +++ /dev/null @@ -1,58 +0,0 @@ -package io.anuke.mindustry.world.blocks.defense; - -import com.badlogic.gdx.graphics.Color; -import io.anuke.mindustry.entities.TileEntity; -import io.anuke.mindustry.entities.bullet.Bullet; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.defense.DeflectorWall.DeflectorEntity; -import io.anuke.ucore.core.Graphics; -import io.anuke.ucore.core.Timers; -import io.anuke.ucore.graphics.Draw; -import io.anuke.ucore.util.Mathf; - -import static io.anuke.mindustry.Vars.tilesize; - -public class MendingWall extends Wall{ - protected float regenSpeed = 0.25f; - - public MendingWall(String name){ - super(name); - update = true; - } - - @Override - public void handleBulletHit(TileEntity entity, Bullet bullet){ - super.handleBulletHit(entity, bullet); - ((DeflectorEntity) entity).hit = 1f; - } - - @Override - public void draw(Tile tile){ - super.draw(tile); - - DeflectorEntity entity = tile.entity(); - - if(entity.hit < 0.0001f) return; - - Graphics.setAdditiveBlending(); - - Draw.color(Color.WHITE); - Draw.alpha(entity.hit * 0.5f); - Draw.rect("blank", tile.drawx(), tile.drawy(), tilesize * size, tilesize * size); - Draw.reset(); - - entity.hit = Mathf.clamp(entity.hit - Timers.delta() / DeflectorWall.hitTime); - - Graphics.setNormalBlending(); - } - - @Override - public void update(Tile tile){ - tile.entity.health = Mathf.clamp(tile.entity.health + regenSpeed * Timers.delta(), 0f, health); - } - - @Override - public TileEntity newEntity(){ - return new DeflectorEntity(); - } -} From 54ad9ba243ccec63d0309412a05b3347d6540d92 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 25 Nov 2018 20:43:45 -0500 Subject: [PATCH 28/32] Added fullscreen map screenshot --- build.gradle | 2 +- core/assets/bundles/bundle.properties | 2 + core/assets/shaders/shield.fragment | 3 +- core/src/io/anuke/mindustry/Vars.java | 3 ++ core/src/io/anuke/mindustry/core/Control.java | 4 ++ .../src/io/anuke/mindustry/core/Renderer.java | 47 +++++++++++++++++++ .../anuke/mindustry/graphics/CacheLayer.java | 6 ++- .../io/anuke/mindustry/graphics/Shaders.java | 12 ++--- .../mindustry/input/DefaultKeybinds.java | 1 + 9 files changed, 67 insertions(+), 13 deletions(-) diff --git a/build.gradle b/build.gradle index f54b84eb8c..ac74bf324b 100644 --- a/build.gradle +++ b/build.gradle @@ -25,7 +25,7 @@ allprojects { appName = 'Mindustry' gdxVersion = '1.9.9' roboVMVersion = '2.3.0' - uCoreVersion = '09e13f973a0769d971316d1d4f4a1eef3570926f' + uCoreVersion = '7610a9e20ebb0db62256b70f97e1783f5416e71d' getVersionString = { String buildVersion = getBuildVersion() diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index cd3cf7d7ed..6cae7f175d 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -10,6 +10,7 @@ text.link.itch.io.description = itch.io page with PC downloads and web version text.link.google-play.description = Google Play store listing text.link.wiki.description = Official Mindustry wiki text.linkfail = Failed to open link!\nThe URL has been copied to your clipboard. +text.screenshot = Screenshot saved to {0} text.gameover = Game Over text.gameover.pvp = The[accent] {0}[] team is victorious! text.sector.gameover = This sector has been lost. Re-deploy? @@ -384,6 +385,7 @@ command.retreat = Retreat command.patrol = Patrol keybind.press = Press a key... keybind.press.axis = Press an axis or key... +keybind.screenshot.name = Map Screenshot keybind.move_x.name = Move x keybind.move_y.name = Move y keybind.select.name = Select/Shoot diff --git a/core/assets/shaders/shield.fragment b/core/assets/shaders/shield.fragment index e71cb95f37..f771e59dd3 100644 --- a/core/assets/shaders/shield.fragment +++ b/core/assets/shaders/shield.fragment @@ -12,7 +12,6 @@ precision highp int; uniform sampler2D u_texture; uniform vec2 u_texsize; uniform float u_time; -uniform float u_scaling; uniform float u_dp; uniform vec2 u_offset; @@ -28,7 +27,7 @@ void main() { vec2 T = v_texCoord.xy; vec2 coords = (T * u_texsize) + u_offset; - T += vec2(sin(coords.y / 3.0 + u_time / 20.0) / 240.0, sin(coords.x / 3.0 + u_time / 20.0) / 240.0) * u_scaling; + T += vec2(sin(coords.y / 3.0 + u_time / 20.0), sin(coords.x / 3.0 + u_time / 20.0)) / u_texsize; float si = sin(u_time / 20.0) / 8.0; vec4 color = texture2D(u_texture, T); diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index ec2026897e..14636b4abd 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -81,6 +81,8 @@ public class Vars{ public static boolean android; //main data directory public static FileHandle dataDirectory; + //subdirectory for screenshots + public static FileHandle screenshotDirectory; //directory for user-created map data public static FileHandle customMapDirectory; //save file directory @@ -172,6 +174,7 @@ public class Vars{ android = Gdx.app.getType() == ApplicationType.Android; dataDirectory = Settings.getDataDirectory(appName); + screenshotDirectory = dataDirectory.child("screenshots/"); customMapDirectory = dataDirectory.child("maps/"); saveDirectory = dataDirectory.child("saves/"); baseCameraScale = Math.round(Unit.dp.scl(4)); diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index 90b87f56e1..0db265aa67 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -373,6 +373,10 @@ public class Control extends Module{ } } + if(Inputs.keyTap("screenshot")){ + renderer.takeMapScreenshot(); + } + }else{ if(!state.isPaused()){ Timers.update(); diff --git a/core/src/io/anuke/mindustry/core/Renderer.java b/core/src/io/anuke/mindustry/core/Renderer.java index 08b9f9de43..efc8b0a500 100644 --- a/core/src/io/anuke/mindustry/core/Renderer.java +++ b/core/src/io/anuke/mindustry/core/Renderer.java @@ -1,10 +1,16 @@ package io.anuke.mindustry.core; import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.Pixmap; +import com.badlogic.gdx.graphics.PixmapIO; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.math.Rectangle; import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.utils.BufferUtils; +import com.badlogic.gdx.utils.ScreenUtils; +import com.badlogic.gdx.utils.TimeUtils; import io.anuke.mindustry.content.fx.Fx; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.entities.Player; @@ -33,6 +39,7 @@ import io.anuke.ucore.graphics.Lines; import io.anuke.ucore.graphics.Surface; import io.anuke.ucore.modules.RendererModule; import io.anuke.ucore.scene.utils.Cursors; +import io.anuke.ucore.util.Bundles; import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Pooling; import io.anuke.ucore.util.Translator; @@ -378,4 +385,44 @@ public class Renderer extends RendererModule{ targetscale = Mathf.clamp(targetscale, Math.round(s * 2), Math.round(s * 5)); } + public void takeMapScreenshot(){ + float vpW = Core.camera.viewportWidth, vpH = Core.camera.viewportHeight; + int w = world.width()*tilesize, h = world.height()*tilesize; + int pw = pixelSurface.width(), ph = pixelSurface.height(); + showFog = false; + disableUI = true; + pixelSurface.setSize(w, h, true); + 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; + + draw(); + + showFog = true; + disableUI = false; + Core.camera.viewportWidth = vpW; + Core.camera.viewportHeight = vpH; + + pixelSurface.getBuffer().begin(); + byte[] lines = ScreenUtils.getFrameBufferPixels(0, 0, w, h, true); + for(int i = 0; i < lines.length; i+= 4){ + lines[i + 3] = (byte)255; + } + pixelSurface.getBuffer().end(); + + Pixmap fullPixmap = new Pixmap(w, h, Pixmap.Format.RGBA8888); + + BufferUtils.copy(lines, 0, fullPixmap.getPixels(), lines.length); + FileHandle file = screenshotDirectory.child("screenshot-" + TimeUtils.millis() + ".png"); + PixmapIO.writePNG(file, fullPixmap); + fullPixmap.dispose(); + + pixelSurface.setSize(pw, ph, false); + Graphics.getEffectSurface().setSize(pw, ph, false); + + ui.showInfoFade(Bundles.format("text.screenshot", file.toString())); + } + } diff --git a/core/src/io/anuke/mindustry/graphics/CacheLayer.java b/core/src/io/anuke/mindustry/graphics/CacheLayer.java index e83d65df6a..e5afc2fcf5 100644 --- a/core/src/io/anuke/mindustry/graphics/CacheLayer.java +++ b/core/src/io/anuke/mindustry/graphics/CacheLayer.java @@ -65,7 +65,7 @@ public enum CacheLayer{ protected void beginShader(){ //renderer.getBlocks().endFloor(); - renderer.effectSurface.getBuffer().bind(); + renderer.effectSurface.getBuffer().begin(); Graphics.clear(Color.CLEAR); //renderer.getBlocks().beginFloor(); } @@ -73,7 +73,9 @@ public enum CacheLayer{ public void endShader(Shader shader){ renderer.blocks.endFloor(); - renderer.pixelSurface.getBuffer().bind(); + renderer.effectSurface.getBuffer().end(); + + renderer.pixelSurface.getBuffer().begin(); Graphics.shader(shader); Graphics.begin(); diff --git a/core/src/io/anuke/mindustry/graphics/Shaders.java b/core/src/io/anuke/mindustry/graphics/Shaders.java index e3c3a5a656..2bec569e2c 100644 --- a/core/src/io/anuke/mindustry/graphics/Shaders.java +++ b/core/src/io/anuke/mindustry/graphics/Shaders.java @@ -175,17 +175,13 @@ public class Shaders{ @Override public void apply(){ - float scaling = Core.cameraScale / 4f / Core.camera.zoom; - shader.setUniformf("u_dp", Unit.dp.scl(1f)); - //shader.setUniformf("u_color", color); shader.setUniformf("u_time", Timers.time() / Unit.dp.scl(1f)); - shader.setUniformf("u_scaling", scaling); shader.setUniformf("u_offset", Core.camera.position.x - Core.camera.viewportWidth / 2 * Core.camera.zoom, Core.camera.position.y - Core.camera.viewportHeight / 2 * Core.camera.zoom); - shader.setUniformf("u_texsize", Gdx.graphics.getWidth() / Core.cameraScale * Core.camera.zoom, - Gdx.graphics.getHeight() / Core.cameraScale * Core.camera.zoom); + shader.setUniformf("u_texsize", Core.camera.viewportWidth * Core.camera.zoom, + Core.camera.viewportHeight * Core.camera.zoom); } } @@ -200,8 +196,8 @@ public class Shaders{ shader.setUniformf("camerapos", Core.camera.position.x - Core.camera.viewportWidth / 2 * Core.camera.zoom, Core.camera.position.y - Core.camera.viewportHeight / 2 * Core.camera.zoom); - shader.setUniformf("screensize", Gdx.graphics.getWidth() / Core.cameraScale * Core.camera.zoom, - Gdx.graphics.getHeight() / Core.cameraScale * Core.camera.zoom); + shader.setUniformf("screensize", Core.camera.viewportWidth* Core.camera.zoom, + Core.camera.viewportHeight * Core.camera.zoom); shader.setUniformf("time", Timers.time()); } } diff --git a/core/src/io/anuke/mindustry/input/DefaultKeybinds.java b/core/src/io/anuke/mindustry/input/DefaultKeybinds.java index 9db284dc16..8f0117abf9 100644 --- a/core/src/io/anuke/mindustry/input/DefaultKeybinds.java +++ b/core/src/io/anuke/mindustry/input/DefaultKeybinds.java @@ -32,6 +32,7 @@ public class DefaultKeybinds{ "menu", Gdx.app.getType() == ApplicationType.Android ? Input.BACK : Input.ESCAPE, "pause", Input.SPACE, "toggle_menus", Input.C, + "screenshot", Input.P, new Category("multiplayer"), "player_list", Input.TAB, "chat", Input.ENTER, From 51a8144f4924206b066c154bebfc9e056797eddc Mon Sep 17 00:00:00 2001 From: beito Date: Mon, 26 Nov 2018 12:54:46 +0900 Subject: [PATCH 29/32] Update Japanese translations (#357) * Add new japanese translation It translated on commit 66810c8. so it don't apply changes from commit 17e0489. * Update Japanese translation Applies commit 7a51693. and small changes. * Upadte Japanese translations * Update Japanese * Update Japanese * Update Japanese translations Improve and update for new changes * Update Japanese * Update Japanese translations --- core/assets/bundles/bundle_ja.properties | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index 3ab3a1ba2b..b9c8600522 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -1,5 +1,6 @@ text.credits.text = Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GRAY](In case you can't tell, this text is currently unfinished.\nTranslators, don't edit it yet!) text.credits = クレジット +text.contributors = 翻訳や協力してくださった方々 text.discord = DiscordのMindustryに参加! text.link.discord.description = Mindustryの公式Discordグループ text.link.github.description = ゲームのソースコード @@ -22,7 +23,7 @@ text.level.select = レベル選択 text.level.mode = ゲームモード: text.construction.desktop = ブロックの選択や建設を止めるには、[accent]スペースを使用してください[]。 text.construction.title = ブロック建設ガイド -text.construction = [accent]ブロック建設モード[]になりました。\n設置するには、機体の近くの設置可能な場所をタップしてください。\nブロックを選択した状態で、チェックボタンを押して確認すると、機体が建設を始めます。\n\n- [accent]ブロックの削除[]は、タップで範囲を選択してください。\n- [accent]範囲の選択[]は、長押しして、範囲のブロックをドラッグしてください。\n- [accent]一列にブロックを設置[]するには、 タップで空いている場所を長押しして、伸ばしたい方向にドラッグしてください\n- [accent]建設や範囲の選択をキャンセル[]するには、左下の X ボタンを押してください。 +text.construction = [accent]ブロック建設モード[]になりました。\n設置するには、機体の近くの設置可能な場所をタップしてください。\nブロックを選択した状態で、チェックボタンを押して確認すると、機体が建設を始めます。\n\n- [accent]ブロックの撤去[]は、タップして範囲を選択してください。\n- [accent]範囲の選択[]は、長押しして、範囲のブロックをドラッグしてください。\n- [accent]一列にブロックを設置[]するには、 タップで空いている場所を長押しして、伸ばしたい方向にドラッグしてください\n- [accent]建設や範囲の選択をキャンセル[]するには、左下の X ボタンを押してください。 text.deconstruction.title = ブロック撤去ガイド text.deconstruction = [accent]ブロック撤去モード[]になりました。\n\nブロックを撤去するには、機体の近くのブロックをタップしてください。\nブロックを選択した状態で、チェックボタンを押して確認すると、機体がブロックの撤去を始めます。\n\n- [accent]ブロックの破壊[]は、タップで範囲を選択してください。\n- [accent]範囲を選択してブロックを撤去[]するには、 タップで空いている場所を長押しして、伸ばしたい方向にドラッグしてください\n- [accent]撤去や範囲選択をキャンセル[]するには、左下の X ボタンを押してください。 text.showagain = 次回以降表示しない @@ -71,6 +72,7 @@ text.nextmission = 次のミッションへ text.maps.none = [LIGHT_GRAY]マップが存在しません! text.about.button = About text.name = 名前: +text.noname = 先に[accent]プレイヤー名[]を決めてください。 text.filename = ファイル名: text.unlocked = 新しいブロックをアンロック! text.unlocked.plural = 新しいブロックをアンロック! @@ -302,7 +304,7 @@ text.blocks.powerdamage = 電力/ダメージ text.blocks.inputitemcapacity = 搬入アイテム容量 text.blocks.outputitemcapacity = 搬出アイテム容量 text.blocks.itemcapacity = アイテム容量 -text.blocks.basepowergeneration = 電力発電量 +text.blocks.basepowergeneration = 基本発電量 text.blocks.powertransferspeed = 電力伝送量 text.blocks.craftspeed = 生産速度 text.blocks.inputliquid = 必要な液体 @@ -311,7 +313,7 @@ text.blocks.inputitem = 必要なアイテム text.blocks.inputitems = 必要なアイテム text.blocks.outputitem = 搬出アイテム text.blocks.drilltier = ドリル -text.blocks.drillspeed = 採掘速度 +text.blocks.drillspeed = 基本採掘速度 text.blocks.liquidoutput = 搬出液体 text.blocks.liquidoutputspeed = 液体搬出速度 text.blocks.liquiduse = 液体使用量 @@ -319,8 +321,8 @@ text.blocks.coolant = 冷却 text.blocks.coolantuse = 冷却使用量 text.blocks.inputliquidfuel = 液体燃料 text.blocks.liquidfueluse = 液体燃料使用量 -text.blocks.boostitem = Boost Item -text.blocks.boostliquid = Boost Liquid +text.blocks.boostitem = 加速アイテム +text.blocks.boostliquid = 加速液体 text.blocks.health = 耐久値 text.blocks.inaccuracy = 不正確 text.blocks.shots = ショット @@ -345,7 +347,7 @@ text.category.liquids = 液体 text.category.items = アイテム text.category.crafting = 製作速度 text.category.shooting = 攻撃速度 -text.category.optional = Optional Enhancements +text.category.optional = 機能強化オプション setting.autotarget.name = 自動ターゲット setting.fpscap.name = 最大FPS setting.fpscap.none = なし @@ -401,7 +403,7 @@ keybind.chat_history_next.name = 次のチャット履歴 keybind.chat_scroll.name = チャットスクロール keybind.drop_unit.name = ドロップユニット keybind.zoom_minimap.name = ミニマップのズーム -mode.text.help.title = モードの説明 +mode.text.help.title = モード説明 mode.waves.name = ウェーブ mode.waves.description = ノーマルモードです。限られた資源でウェーブが自動的に始まります。 mode.sandbox.name = サンドボックス From 70507258ae5af23512c6e7eae6dfb5b488ca25f4 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 25 Nov 2018 22:55:13 -0500 Subject: [PATCH 30/32] Cleanup --- build.gradle | 2 +- core/src/io/anuke/mindustry/graphics/CacheLayer.java | 2 +- core/src/io/anuke/mindustry/graphics/Shaders.java | 3 --- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index ac74bf324b..6367e64024 100644 --- a/build.gradle +++ b/build.gradle @@ -25,7 +25,7 @@ allprojects { appName = 'Mindustry' gdxVersion = '1.9.9' roboVMVersion = '2.3.0' - uCoreVersion = '7610a9e20ebb0db62256b70f97e1783f5416e71d' + uCoreVersion = 'f73e538757ac66ff62d7f25d93011142b6abb8df' getVersionString = { String buildVersion = getBuildVersion() diff --git a/core/src/io/anuke/mindustry/graphics/CacheLayer.java b/core/src/io/anuke/mindustry/graphics/CacheLayer.java index e5afc2fcf5..4a13487541 100644 --- a/core/src/io/anuke/mindustry/graphics/CacheLayer.java +++ b/core/src/io/anuke/mindustry/graphics/CacheLayer.java @@ -73,7 +73,7 @@ public enum CacheLayer{ public void endShader(Shader shader){ renderer.blocks.endFloor(); - renderer.effectSurface.getBuffer().end(); + //renderer.effectSurface.getBuffer().end(); renderer.pixelSurface.getBuffer().begin(); diff --git a/core/src/io/anuke/mindustry/graphics/Shaders.java b/core/src/io/anuke/mindustry/graphics/Shaders.java index 2bec569e2c..254234f419 100644 --- a/core/src/io/anuke/mindustry/graphics/Shaders.java +++ b/core/src/io/anuke/mindustry/graphics/Shaders.java @@ -157,17 +157,14 @@ public class Shaders{ @Override public void apply(){ - // shader.setUniformf("u_progress", progress); shader.setUniformf("u_color", color); shader.setUniformf("u_uv", region.getU(), region.getV()); shader.setUniformf("u_uv2", region.getU2(), region.getV2()); - //shader.setUniformf("u_time", Timers.time()); shader.setUniformf("u_texsize", region.getTexture().getWidth(), region.getTexture().getHeight()); } } public static class Shield extends Shader{ - //public Color color = new Color(); public Shield(){ super("shield", "default"); From 90198be1cbee605f6bb815f6e127fbde988f1d5f Mon Sep 17 00:00:00 2001 From: VizardAlpha <43859764+VizardAlpha@users.noreply.github.com> Date: Mon, 26 Nov 2018 18:34:01 +0100 Subject: [PATCH 31/32] Updates bundle_fr_BE.properties (#358) * Updates bundle_fr_BE.properties * Updates bundle_fr_BE.properties * Update bundle_fr_BE.properties * Update bundle_fr_BE.properties * Update bundle_fr_BE.properties --- core/assets/bundles/bundle_fr_BE.properties | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/core/assets/bundles/bundle_fr_BE.properties b/core/assets/bundles/bundle_fr_BE.properties index ed93ffbf39..1abdc7f293 100644 --- a/core/assets/bundles/bundle_fr_BE.properties +++ b/core/assets/bundles/bundle_fr_BE.properties @@ -1,5 +1,6 @@ -text.credits.text = Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GRAY](In case you can't tell, this text is currently unfinished.\nTranslators, don't edit it yet!) +text.credits.text = Créé par [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] text.credits = Crédits +text.contributors = Traducteurs et contributeurs text.discord = Rejoignez le discord de Mindustry ! text.link.discord.description = Le discord officiel de Mindustry text.link.github.description = Code source du jeu @@ -9,6 +10,7 @@ text.link.itch.io.description = Page web itch.io avec les versions ordinateurs t text.link.google-play.description = Page Google Play Store du jeu text.link.wiki.description = Wiki officiel de Mindustry text.linkfail = L'ouverture du lien a échoué!\nL'URL a été copiée dans votre presse-papier. +text.screenshot = Capture d'écran enregistrée sur {0} text.gameover = Le base a été détruit. text.gameover.pvp = L'équipe[accent] {0}[] a gagnée ! text.sector.gameover = Ce secteur a été perdu. Réessayer ? @@ -54,7 +56,7 @@ text.mission.wave.enemy = Survivez[accent] {0}/{1} []vagues\n{2} Ennemi text.mission.wave.menu = Survivez[accent] {0} []vagues text.mission.battle = Détruire la base ennemie. text.mission.resource.menu = Obtenez {0} x{1} -text.mission.resource = Obtain {0}:\n[accent]{1}/{2}[] +text.mission.resource = Obtenez {0}:\n[accent]{1}/{2}[] text.mission.block = Créez {0} text.mission.unit = Créez {0} unité text.mission.command = Envoyer une commande à {0} unités @@ -71,6 +73,7 @@ text.nextmission = Prochaine Mission text.maps.none = [LIGHT_GRAY]Aucune carte trouvée! text.about.button = À propos text.name = Nom: +text.noname = Choisissez d'abord [accent]un pseudo[]. text.filename = Nom du fichier: text.unlocked = Nouveau bloc debloqué! text.unlocked.plural = Nouveaux blocs débloqués! @@ -150,8 +153,8 @@ text.save.delete.confirm = Êtes-vous sûr de supprimer cette sauvegarde ? text.save.delete = Supprimer text.save.export = Exporter une\nSauvegarde text.save.import.invalid = [accent]Cette sauvegarde est invalide! -text.save.import.fail = [crimson]L'importation de la sauvegarde\na échoué: [accent]{0} -text.save.export.fail = [crimson]L'exportation de la sauvegarde\na échoué: [accent]{0} +text.save.import.fail = [crimson]L'importation de la sauvegarde\na échouée: [accent]{0} +text.save.export.fail = [crimson]L'exportation de la sauvegarde\na échouée: [accent]{0} text.save.import = Importer une sauvegarde text.save.newslot = Nom de la sauvegarde: text.save.rename = Renommer @@ -319,8 +322,8 @@ text.blocks.coolant = Liquide de refroidissement text.blocks.coolantuse = Quantité de liquide de refroidissement utilisé text.blocks.inputliquidfuel = Carburant liquide text.blocks.liquidfueluse = Quantité de carburant liquide utilisé -text.blocks.boostitem = Boost Item -text.blocks.boostliquid = Boost Liquid +text.blocks.boostitem = Objet boostant la production +text.blocks.boostliquid = Liquide boostant la production text.blocks.health = Santé text.blocks.inaccuracy = Précision text.blocks.shots = Tirs @@ -345,7 +348,7 @@ text.category.liquids = Liquides text.category.items = Objets text.category.crafting = Fabrication text.category.shooting = Défense -text.category.optional = Optional Enhancements +text.category.optional = Améliorations facultatives setting.autotarget.name = Visée automatique setting.fpscap.name = Max FPS setting.fpscap.none = Vide From d03ceb2a23d3ab0b38396527b0d16bc2ea944a76 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 26 Nov 2018 12:40:24 -0500 Subject: [PATCH 32/32] Bugfixes / Sorter item memory --- .../ui/fragments/PlacementFragment.java | 8 ++++++-- .../world/blocks/distribution/Sorter.java | 19 ++++++++++++++++--- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java index f3923079d8..6388b3ee28 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java @@ -2,6 +2,7 @@ package io.anuke.mindustry.ui.fragments; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.math.Interpolation; +import com.badlogic.gdx.math.Vector2; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.game.EventType.WorldLoadGraphicsEvent; @@ -33,7 +34,7 @@ public class PlacementFragment extends Fragment{ Category currentCategory = Category.turret; Block hovered, lastDisplay; Tile hoverTile; - Table blockTable, toggler; + Table blockTable, toggler, topTable; boolean shown = true; public PlacementFragment(){ @@ -106,6 +107,7 @@ public class PlacementFragment extends Fragment{ //top table with hover info frame.table("clear", top -> { + topTable = top; top.add(new Table()).growX().update(topTable -> { if((tileDisplayBlock() == null && lastDisplay == getSelected()) || (tileDisplayBlock() != null && lastDisplay == tileDisplayBlock())) return; @@ -194,8 +196,10 @@ public class PlacementFragment extends Fragment{ Block getSelected(){ Block toDisplay = null; + Vector2 v = topTable.stageToLocalCoordinates(Graphics.mouse()); + //setup hovering tile - if(!ui.hasMouse()){ + if(!ui.hasMouse() && topTable.hit(v.x, v.y, false) == null){ Tile tile = world.tileWorld(Graphics.mouseWorld().x, Graphics.mouseWorld().y); if(tile != null){ hoverTile = tile.target(); diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java index e99769ffd6..c7a5737e54 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java @@ -4,7 +4,6 @@ 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; @@ -13,13 +12,17 @@ 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; import java.io.IOException; -import static io.anuke.mindustry.Vars.*; + +import static io.anuke.mindustry.Vars.content; +import static io.anuke.mindustry.Vars.threads; public class Sorter extends Block implements SelectionTrait{ + private static Item lastItem; public Sorter(String name){ super(name); @@ -35,6 +38,13 @@ public class Sorter extends Block implements SelectionTrait{ return true; } + @Override + public void playerPlaced(Tile tile){ + if(lastItem != null){ + 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(); @@ -108,7 +118,10 @@ public class Sorter extends Block implements SelectionTrait{ @Override public void buildTable(Tile tile, Table table){ SorterEntity entity = tile.entity(); - buildItemTable(table, () -> entity.sortItem, item -> Call.setSorterItem(null, tile, item)); + buildItemTable(table, () -> entity.sortItem, item -> { + lastItem = item; + Call.setSorterItem(null, tile, item); + }); } @Override