From 6abbc3eca787250be9a96b4c74e3fc7f1de6741e Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 26 Jan 2018 00:08:12 -0500 Subject: [PATCH] Implemented map run-length encoding, updated KO lang --- core/assets/bundles/bundle_ko.properties | 106 +++++++++--------- .../mindustry/ai/OptimizedPathFinder.java | 16 --- core/src/io/anuke/mindustry/core/Control.java | 4 +- .../io/anuke/mindustry/core/NetClient.java | 2 + .../src/io/anuke/mindustry/net/NetworkIO.java | 55 ++++++--- 5 files changed, 95 insertions(+), 88 deletions(-) diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index 128d4fb16a..f27ff409be 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -17,7 +17,7 @@ text.name = 이름: text.public = 공개 text.players = {0} 명 플레이어 온라인 text.players.single = {0} 명 플레이어 온라인 -text.server.mismatch = 패킷 오류 : 클라이언트 / 서버 버전 불일치합니다! 당신과 호스트가 최신 버전의 Mindustry 를 가지고 있는지 확인해주세요! +text.server.mismatch = 패킷 오류 : 클라이언트 / 서버 버전이 불일치합니다! 당신과 호스트가 최신 버전의 Mindustry 를 가지고 있는지 확인해주세요! .server.closing = [accent]서버 닫는중... text.server.kicked.kick = 당신은 서버에서 쫓겨났습니다! text.server.kicked.invalidPassword = 잘못된 비밀번호 입니다! @@ -75,7 +75,7 @@ text.save.map = 맵: {0} text.save.wave = 웨이브 {0} text.save.date = 마지막 저장 날짜 : {0} text.confirm = 확인 -text.delete = 삭제 +text.delete = 삭제 text.ok = 승인 text.open = 열기 text.cancel = 취소 @@ -94,7 +94,7 @@ text.editor.badsize = [orange]이미지 크기가 잘못되었습니다![]\n가 text.editor.errorimageload = 이미지 파일 로드중 오류 발생 : [orange]{0} text.editor.errorimagesave = 이미지 파일 저장중 오류 발생 : [orange]{0} text.editor.generate = 생성하기 -text.editor.resize = 크기 조정 +text.editor.resize = 크기 조정 text.editor.loadmap = 맵 로드 text.editor.savemap = 맵 저장 text.editor.loadimage = 이미지 로드 @@ -115,7 +115,7 @@ text.height = 높이: text.randomize = 무작위 text.apply = 적용 text.update = 업데이트 -text.menu = 메뉴 +text.menu = 메뉴 text.play = 플레이 text.load = 로드 text.save = 저장 @@ -154,7 +154,7 @@ text.blocks.powersecond = 발전량 / 초 text.blocks.powerdraindamage = 에너지 소모량 / 데미지 text.blocks.shieldradius = 쉴드 반경 text.blocks.itemspeedsecond = 운반량 / 초 -text.blocks.range = 범위 +text.blocks.range = 범위 text.blocks.size = 크기 text.blocks.powerliquid = 전력 / 액체량 text.blocks.maxliquidsecond = 최대 액체 운반량 / 초 @@ -167,7 +167,7 @@ text.blocks.ammoitem = 탄약 /아이템 text.blocks.maxitemssecond = 최대 항목 / 초 text.blocks.powerrange = 출력 범위 text.blocks.lasertilerange = 파워 레이저 범위 -text.blocks.capacity = 용량 +text.blocks.capacity = 용량 text.blocks.itemcapacity = 아이템 저장용량 text.blocks.maxpowergenerationsecond = 최대 발전량 / 초 text.blocks.powergenerationsecond = 전력 생산량 / 초 @@ -193,12 +193,12 @@ text.blocks.poweritem = 전력 / 아이템 text.placemode = 블럭 설치 모드 text.breakmode = 블럭 삭제 모드 text.health = 체력 -setting.difficulty.easy = 쉬움 +setting.difficulty.easy = 쉬움 setting.difficulty.normal = 보통 setting.difficulty.hard = 어려움 setting.difficulty.insane = 미침 setting.difficulty.purge = 극악 -setting.difficulty.name = 난이도 +setting.difficulty.name = 난이도 setting.screenshake.name = 화면 흔들림 setting.smoothcam.name = 부드러운 카메라 이동 setting.indicators.name = 적 표시 화살표 @@ -229,47 +229,47 @@ map.tundra.name = 툰드라 map.spiral.name = 나선 map.tutorial.name = 튜토리얼 tutorial.intro.text = [yellow] 튜토리얼에 오신 것을 환영합니다.[] 시작하려면 '다음'을 누르세요. -tutorial.moveDesktop.text = 이동하려면 [orange] [[WASD] [] 키를 사용하세요. 빠르게 이동하려면 [orange] 쉬프트[]를 길게 누르세요. [orange] CTRL []을 누르고 있으면 [orange] 스크롤 휠 []을 사용하여 확대 또는 축소 할 수 있습니다. -tutorial.shoot.text = 마우스를 사용하여 조준하고 [오렌지] 마우스 왼쪽 버튼 []을 잡고 촬영하십시오. [노란색] 타겟 []에서 연습 해보십시오. -tutorial.moveAndroid.text = 보기를 이동하려면 손가락 하나를 화면 전체로 끕니다. 핀치 앤 드래그를 사용하여 확대 또는 축소합니다. -tutorial.placeSelect.text = 오른쪽 하단의 블록 메뉴에서 [yellow] 컨베이어 []를 선택하세요. -tutorial.placeConveyorDesktop.text = [orange] [[scrollwheel] []을 사용하여 컨베이어를 [orange] forwards [] 방향으로 회전시킨 다음 [orange] [left mouse button] []을 사용하여 [yellow] 표시된 위치 []에 놓습니다. -tutorial.placeConveyorAndroid.text = 컨베이어를 회전 시키려면 [orange] [rotate button] []을 사용하십시오. [orange] forwards []를 사용하여 한 손가락으로 원하는 위치로 드래그 한 다음 [orange] 표시된 위치 []에 놓으십시오. [[체크 표시][]. -tutorial.placeConveyorAndroidInfo.text = 또는 왼쪽 하단의 십자선 아이콘을 눌러 [주황색] [[터치 모드] []로 전환하고 화면을 두드려 블럭을 배치 할 수 있습니다. 터치 모드에서 블록은 왼쪽 하단의 화살표로 회전 할 수 있습니다. 다음 노란색 []을 눌러 시도해보십시오. -tutorial.placeDrill.text = 이제, 표시된 위치에 [yellow] 돌 드릴 []을 선택하여 배치하세요. -tutorial.blockInfo.text = 블록에 대해 더 자세히 알고 싶다면, 오른쪽 상단에있는 [orange] 물음표 []를 눌러 설명을 읽으세요. -tutorial.deselectDesktop.text = [orange] [[마우스 오른쪽 버튼] []을 사용하여 블록 선택을 취소 할 수 있습니다. -tutorial.deselectAndroid.text = [orange] X [] 버튼을 눌러 블록 선택을 취소 할 수 있습니다. +tutorial.moveDesktop.text = 이동하려면 [orange] [[WASD] [] 키를 사용하세요. 또한, [orange]Shift[]를 [orange] 누르고 있으면 빠르게 이동할 수 있습니다. [orange]CTRL[]을 누르고 있으면 [orange] 스크롤 휠 []을 사용하여 확대 또는 축소 할 수 있습니다. +tutorial.shoot.text = 마우스를 사용하여 조준하고 [orange]왼쪽 마우스 버튼[]을 눌러 쏘세요. 저기 노란색 [yellow]타겟[]앞에서 연습해보세요. +tutorial.moveAndroid.text = 화면을 이동하기 위해서 한손가락으로 스크롤을 하세요. 줌인 줌아웃은 두손가락으로 하시면 됩니다. +tutorial.placeSelect.text = 오른쪽 하단에 블럭 메뉴에서[yellow]컨베이어[]를 선택하세요. +tutorial.placeConveyorDesktop.text = [orange][[scrollwheel][]을 사용하여 컨베이어를[orange]앞 방향[]으로 돌린다음 [yellow]표시된 위치[]에 [orange][[left mouse button][]을 이용해 설치 합니다. +tutorial.placeConveyorAndroid.text = 컨베이어를 회전 시키기 위해[orange][[rotate button][]를 터치하고 [orange]앞방향[]을 보게 한후, 한손가락으로 [yellow]표시된 위치[]에 [orange][[checkmark][]으로 설치하세요. +tutorial.placeConveyorAndroidInfo.text = 아니면 왼쪽 하단에 [orange][[touch mode][]를 눌러 터치모드로 전환하고 터치를 이용해 블럭을 배치 할수 있습니다 방향을 바꾸려면 왼쪽하단에 화살표로 바꾸시면 됩니다[yellow]다음[]을 눌러 시도해 보세요 +tutorial.placeDrill.text = 이제, 표시된 위치에 [yellow]돌 드릴[]을 선택하여 배치하세요. +tutorial.blockInfo.text = 블록에 대해 더 자세히 알고 싶다면, 오른쪽 상단에있는 [orange]물음표[]를 눌러 설명을 읽으세요. +tutorial.deselectDesktop.text = [orange][[마우스 오른쪽 버튼][]을 사용하여 블록을 선택 해제할 수 있습니다. +tutorial.deselectAndroid.text = [orange]X[] 버튼을 눌러 블록을 선택 해제할 수 있습니다. tutorial.drillPlaced.text = 드릴은 이제 [yellow] 돌[]을 생산할 것이고, 컨베이어로 출력 한 다음 [yellow] 코어 []로 옮길 것입니다. tutorial.drillInfo.text = 각 광석은 그에 맞는 드릴이 필요합니다. 돌은 돌 드릴이 필요하고, 철은 철 드릴이 필요합니다. -tutorial.drillPlaced2.text = 아이템을 코어로 이동하면 왼쪽 상단의 [orange] 아이템 인벤토리 []에 표시됩니다. 인벤토리의 아이템은 블록을 배치할때 사용됩니다. +tutorial.drillPlaced2.text = 아이템을 코어로 이동하면 왼쪽 상단의 [orange]아이템 인벤토리[]에 표시됩니다. 인벤토리의 아이템은 블록을 배치할때 사용됩니다. tutorial.moreDrills.text = 드릴과 컨베이어는 많이 연결할 수 있습니다. 이것처럼요. -tutorial.deleteBlock.text = 삭제하려는 블록에서 마우스 오른쪽 버튼 []을 클릭하여 블록을 삭제할 수 있습니다. 이 컨베이어를 삭제 해보십시오. -tutorial.deleteBlockAndroid.text = 왼쪽 하단의 [주황색] 중단 모드 메뉴 []에서 십자선 []을 선택하고 블록을 눌러 [오렌지]로 블록을 삭제할 수 있습니다. 이 컨베이어를 삭제 해보십시오. +tutorial.deleteBlock.text = 블록을 삭제하고 싶으면 [orange]마우스 오른쪽 버튼[]을 클릭하여 블록을 삭제할 수 있습니다. 이 컨베이어를 삭제 해보십시오. +tutorial.deleteBlockAndroid.text = 왼쪽 하단에 [orange]블록삭제모드[]안에 [orange]십자선을[] 선택한 다음 블록을 눌러 삭제할 수 있습니다. 이 컨베이어를 삭제해 보세요. tutorial.placeTurret.text = 이제[yellow] 표시된 위치 []에 [yellow]포탑[]을 선택하여 배치하세요. -tutorial.placedTurretAmmo.text = 이 포탑은 컨베이어에서 [황색] 탄약을 받아 들일 것입니다. 마우스를 가져 가면 [녹색] 녹색 막대 []를 확인하여 얼마나 많은 탄약이 있는지 확인할 수 있습니다. -tutorial.turretExplanation.text = 포탑은 충분한 탄약을 보유하고있는 한 범위 내에서 가장 가까운 적에게 자동으로 내부를 쏜다. -tutorial.waves.text = [황색] 60 초마다, [산호] 원수의 물결이 특정 위치에 스폰되고 핵을 파괴하려고 시도합니다. +tutorial.placedTurretAmmo.text = 이 포탑은 컨베이어에서 [yellow]탄약[]을 받습니다 커서를 가져 가묜[green]녹색 막대[]를 통해 얼마나 많은 탄약이 있는지 확인 할수 있습니다. +tutorial.turretExplanation.text = 포탑은 충분한 탄약을 보유하고 있는 한 범위 내에서 가장 가까운 적에게 자동으로 총알을 쏩니다. +tutorial.waves.text = [yellow]60[] 초 마다, 웨이브가 시작되고[coral]적[]들이 특정 위치에 스폰되어 코어를 파괴하기위해 올 것 입니다. tutorial.coreDestruction.text = 당신의 목표는 [yellow]코어를 방어하는 것[]입니다. 코어가 파괴되면 [coral]게임에서 패배합니다[]. -tutorial.pausingDesktop.text = 휴식을 취해야 할 경우 왼쪽 상단이나 [오렌지] 스페이스 []에서 [오렌지] 일시 중지 버튼 []을 눌러 게임을 일시 중지하십시오. 일시 중지 된 상태에서 블록을 선택하고 배치 할 수는 있지만 이동하거나 촬영할 수는 없습니다. -tutorial.pausingAndroid.text = 휴식을 취해야 할 경우 왼쪽 상단의 [오렌지] 일시 중지 버튼 []을 눌러 게임을 일시 중지하십시오. 일시 중지 된 상태에서 선택 및 배치 블록을 배치 할 수 있습니다. -tutorial.purchaseWeapons.text = 왼쪽 하단에있는 업그레이드 메뉴를 열어 새로운 [노란색] 무기 []를 구입할 수 있습니다. -tutorial.switchWeapons.text = 왼쪽 하단의 아이콘을 클릭하거나 숫자 [오렌지] [[1-9] []를 사용하여 무기를 전환하십시오. -tutorial.spawnWave.text = 여기 파도가왔다. 그들을 파괴하십시오. -tutorial.pumpDesc.text = 추후 파도에서 발전기 또는 추출기 용 액체를 분배하기 위해 [노란색] 펌프 []를 사용해야 할 수도 있습니다. -tutorial.pumpPlace.text = 펌프는 드릴과 유사하게 작동하지만, 아이템 대신 액체를 생산합니다. [yellow]지정된 석유[]에 펌프를 놓으세요. -tutorial.conduitUse.text = 이제 [orange] 도관 []을 펌프에서 멀리 떨어지게하십시오. +tutorial.pausingDesktop.text = 일시정지를 하고 싶은 경우 왼쪽 상단의 [orange]스페이스[]를 눌러 게임을 일시정지하세요. 일시 중지 된 상태에서는 블록을 선택하고 배치할수는 있지만 이동하거나 쏠수는 없습니다. +tutorial.pausingAndroid.text = 일시정지를 하고 싶은 경우 왼쪽 상단의 [orange]일시 정지 버튼[]을 눌러 게임을 일시정지하세요. 일시 중지 된 상태에서도 선택 및 블록 배치를 할 수 있습니다. +tutorial.purchaseWeapons.text = 왼쪽 하단에 있는 업그레이드 메뉴를 열어 새로운 [yellow]무기[]를 구입할 수 있습니다. +tutorial.switchWeapons.text = 왼쪽 하단의 아이콘을 클릭하거나 숫자 [orange][[1-9][] 버튼을 사용하여 무기를 전환하세요 +tutorial.spawnWave.text = 웨이브가 시작되었습니다. 적들을 파괴하세요! +tutorial.pumpDesc.text = 이후 웨이브에선 발전기 또는 추출기 용 액체를 분배하기 위해 [yellow]펌프[] 를 사용해야 할 수도 있습니다 +tutorial.pumpPlace.text = 펌프는 드릴과 유사하게 작동하지만, 아이템 대신 액체를 생산합니다. [yellow]지정된 위치[]에 펌프를 놓으세요. +tutorial.conduitUse.text = 이제 [orange]파이프[] 를 펌프에서 멀리 떨어트려 두세요 tutorial.conduitUse2.text = 하나 더... tutorial.conduitUse3.text = 하나 더... tutorial.generator.text = 이제 파이프 끝 부분에 [orange]석유 발전기[] 블록을 놓으세요. tutorial.generatorExplain.text = 이제 이 발전기는 석유에서 [yellow]전력[]을 생성합니다. tutorial.lasers.text = 전력은 [yellow]파워 레이저[]를 통해 전송됩니다. 회전한 후 이곳에 배치하세요. -tutorial.laserExplain.text = 발전기가 이제 레이저 블록으로 전원을 이동합니다. [황색] 불투명 [] 광선은 현재 전력을 전송 중임을 의미하고 [황색] 투명 [] 광선은 전송하지 않음을 의미합니다. -tutorial.laserMore.text = 블록 위로 마우스를 올리고 상단의 [황색] 노란 막대 []를 확인하여 블록의 전력을 확인할 수 있습니다. -tutorial.healingTurret.text = 이 레이저는 [석회] 수리 터렛에 전원을 공급하는 데 사용할 수 있습니다 []. 여기에 하나 넣으세요. -tutorial.healingTurretExplain.text = 힘이있는 한,이 포탑은 주변 블록을 수리 할 것입니다. [] 노는 중에 가능한 한 빨리 기지에 하나가 있는지 확인하십시오! -tutorial.smeltery.text = 많은 블록에서 [오렌지] 제련소가 필요한 [오렌지] 스틸 []을 만들 필요가 있습니다. 여기에 하나 넣으세요. -tutorial.smelterySetup.text = 이 제련소는 석탄을 연료하여 투입된 철에서 [orange] 강철 []을 생산할 것입니다. +tutorial.laserExplain.text = 발전기가 이제 레이저 블록으로 전력을 보냅니다. [yellow]불두명[] 광선은 현재 전력을 전송 중임을 의미하고 [yellow]투명[] 광선은 전송하지 않음을 의미합니다. +tutorial.laserMore.text = 블록 위로 마우스를 올리고 상단의 [yellow]노란 막대[]를 확인하여 블록의 전력을 볼 수 있습니다 +tutorial.healingTurret.text = 이 레이저는 [lime]수리터렛[] 에 전력을 공급하는데 사용합니다. 여기에 하나 놓으세요 +tutorial.healingTurretExplain.text = 전력이 있는 한 이 포탑은 [lime]주변 블록을 수리[] 합니다 시간이 있을 때 가능한 한 빨리 기지에 하나가 있는지 확인하세요! +tutorial.smeltery.text = 많은 블록들은[orange]강철[]을 필요로 합니다. [orange]제련소[]를 선택해 여기에 놓으세요. +tutorial.smelterySetup.text = 이 제련소는 석탄을 연료로 사용하며 철을 넣으면 [orange]강철[] 을 생산할 것입니다. tutorial.end.text = 이것으로 튜토리얼을 마칩니다! 행운을 빕니다! keybind.move_x.name = x축 이동 keybind.move_y.name = y축 이동 @@ -454,26 +454,26 @@ block.nuclearreactor.fulldescription = 우라늄 발전기의 고급 버전. 우 block.turret.name = 포탑 block.turret.fulldescription = 간단한 포탑. 탄약으로 돌을 사용합니다. 이중 포탑보다 약간 넓은 범위를가집니다. block.doubleturret.name = 이중 포탑 -block.doubleturret.fulldescription = 터렛의 약간 더 강력한 버전입니다. 탄약에 돌을 사용합니다. 더 많은 데미지를 주지만 범위는 낮습니다. 두 발의 총알을 쏴. -block.machineturret.name = 싸우는 터렛 -block.machineturret.fulldescription = 표준 포위 대포. 탄약에 철분을 사용합니다. 적정한 데미지를 입힌 빠른 발사 속도를 가지고 있습니다. +block.doubleturret.fulldescription = 포탑의 상위 버전입니다. 탄약으로 돌을 사용합니다. 더 많은 데미지를 주지만 범위는 낮습니다. 두발에 총알을 쏩니다 +block.machineturret.name = 게틀링 터렛 +block.machineturret.fulldescription = 표준적인 포탑. 탄약으로 철을 사용합니다. 적당한 데미지에 빠른 발사 속도를 가지고 있습니다. block.shotgunturret.name = 스플리터 터렛 -block.shotgunturret.fulldescription = 표준 포탑. 탄약에 철분을 사용합니다. 총알 7 발을 쏘아. 범위가 낮지 만 전투 중 포탑보다 높은 데미지 출력. +block.shotgunturret.fulldescription = 표준적인 포탑. 탄약으로 철을 사용합니다. 7발에 총알을 쏩니다. 범위가 낮지만 게틀링 포탑보다 높은 데미지를 가지고 있습니다. block.flameturret.name = 화염 터렛 -block.flameturret.fulldescription = 고급 근거리 포탑. 탄약에 석탄을 사용합니다. 범위는 매우 낮지 만 매우 높습니다. 가까운 분기에 좋습니다. 벽 뒤에 사용하는 것이 좋습니다. +block.flameturret.fulldescription = 고급 근거리 포탑. 탄약으로 석탄을 사용합니다. 범위는 낮지만 높은 데미지를 가지고 있습니다, 벽 뒤에 두는것이 좋습니다. block.sniperturret.name = 레일 건 터렛 -block.sniperturret.fulldescription = 고급 장거리 포탑. 탄약에 강철을 사용합니다. 매우 높은 데미지를 입지만 발사 속도는 낮습니다. 비싸지 만 사용 범위에 따라 적의 선과 멀리 떨어질 수 있습니다. -block.mortarturret.name = 플랙 터렛 -block.mortarturret.fulldescription = 고급 스플래시 데미지 터렛. 탄약에 석탄을 사용합니다. 매우 느린 발사 속도와 총알은 있지만, 단일 타겟과 스플래쉬 데미지는 매우 높습니다. 많은 적군에게 유용합니다. +block.sniperturret.fulldescription = 고급 장거리 포탑. 탄약으로 강철을 사용합니다. 매우 높은 데미지를 입지만 발사 속도는 낮습니다. 비싸지 만 사용 범위에 따라 적의 선과 멀리 떨어질 수 있습니다. +block.mortarturret.name = 플랭크 터렛 +block.mortarturret.fulldescription = 고급 범위공격 터렛. 탄약으로 석탄을 사용합니다. 매우 느린 발사 속도와 총알을 가지고 있지만, 단일 타겟 데미지와 스플래쉬 데미지는 매우 높습니다. 뭉쳐있는 적군에게 유용합니다. block.laserturret.name = 레이저 포탑 -block.laserturret.fulldescription = 고급 싱글 타겟 터렛. 전원을 사용합니다. 좋은 중거리 포위 터렛. 단일 타겟 만. 절대 놓치지 마십시오. +block.laserturret.fulldescription = 고급 싱글 타겟 터렛. 전력을 사용합니다. 좋은 중거리 포위 터렛. 단일 타겟 만. 절대 놓치지 마십시오. block.waveturret.name = 테슬라 포탑 -block.waveturret.fulldescription = 고급 다중 타겟 포탑. 전원을 사용합니다. 중간 범위. 놓칠 염려가 없습니다. 손상은 거의 없지만 체인 조명으로 여러 명의 적을 동시에 때릴 수 있습니다. +block.waveturret.fulldescription = 고급 다중 타겟 포탑. 전력을 사용합니다. 중간 범위를 가지고 있으며. 타겟을 놓칠 염려가 없습니다. 데미지는 거의 없지만 연속공격으로 여러 명의 적들을 동시에 때릴 수 있습니다. block.plasmaturret.name = 플라즈마 포탑 -block.plasmaturret.fulldescription = 진창 포탑의 고급 버전. 석탄을 탄약으로 사용합니다. 매우 낮은 데미지, 중저 범위의 데미지. -block.chainturret.name = 체인 터렛 -block.chainturret.fulldescription = 궁극의 급속 터렛 터렛. 우라늄을 탄약으로 사용합니다. 높은 사격 률로 대형 슬러그를 쏘십시오. 중간 범위. 여러 타일에 걸쳐 있습니다. 매우 힘들다. +block.plasmaturret.fulldescription = 포탑의 최고급 버전. 석탄을 탄약으로 사용합니다. 매우 높은 데미지를 가지고 있고, 근거리와 중거리의 걸쳐있습니다. +block.chainturret.name = 체인 포탑 +block.chainturret.fulldescription = 궁극에 고속 포탑. 우라늄을 탄약으로 사용합니다. 높은 발사속도에 적당한 사정거리를 가지고 있고 대형 슬러그를 쏩니다. 여러 타일에 걸쳐 있으며. 매우 아픕니다. block.titancannon.name = 타이탄 캐논 -block.titancannon.fulldescription = 궁극의 장거리 포탑. 우라늄을 탄약으로 사용합니다. 중간 스킬로 큰 스플래쉬 데미지 껍질을 쏘십시오. 장거리. 여러 타일에 걸쳐 있습니다. 매우 힘들다. +block.titancannon.fulldescription = 궁극의 장거리 포탑. 우라늄을 탄약으로 사용합니다. 적당한 발사속도에 긴 사정거리를 가지고 있고 여러 타일에 걸쳐 있으며. 매우 아픕니다 block.playerspawn.name = 플레이어 스폰 지점 block.enemyspawn.name = 적 스폰 지점 diff --git a/core/src/io/anuke/mindustry/ai/OptimizedPathFinder.java b/core/src/io/anuke/mindustry/ai/OptimizedPathFinder.java index 8cb177b051..6898ee1215 100644 --- a/core/src/io/anuke/mindustry/ai/OptimizedPathFinder.java +++ b/core/src/io/anuke/mindustry/ai/OptimizedPathFinder.java @@ -8,7 +8,6 @@ import com.badlogic.gdx.utils.TimeUtils; /**An IndexedAStarPathfinder that uses an OptimizedGraph, and therefore has less allocations.*/ public class OptimizedPathFinder implements PathFinder { OptimizedGraph graph; - //NodeRecord[] nodeRecords; //TODO remove. IntMap> records = new IntMap<>(); BinaryHeap> openList; NodeRecord current; @@ -25,7 +24,6 @@ public class OptimizedPathFinder implements PathFinder { @SuppressWarnings("unchecked") public OptimizedPathFinder(OptimizedGraph graph) { this.graph = graph; - //this.nodeRecords = (NodeRecord[]) new NodeRecord[graph.getNodeCount()]; this.openList = new BinaryHeap<>(); } @@ -218,20 +216,6 @@ public class OptimizedPathFinder implements PathFinder { }else{ return records.get(graph.getIndex(node)); } - /* - int index = graph.getIndex(node); - NodeRecord nr = nodeRecords[index]; - if (nr != null) { - if (nr.searchId != searchId) { - nr.category = UNVISITED; - nr.searchId = searchId; - } - return nr; - } - nr = nodeRecords[index] = new NodeRecord<>(); - nr.node = node; - nr.searchId = searchId; - return nr;*/ } /** diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index 58583fb4f4..145e28ae9c 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -15,7 +15,6 @@ import io.anuke.mindustry.entities.effect.Shield; import io.anuke.mindustry.entities.enemies.Enemy; import io.anuke.mindustry.entities.enemies.EnemyTypes; import io.anuke.mindustry.game.*; -import io.anuke.mindustry.game.Tutorial; import io.anuke.mindustry.graphics.Fx; import io.anuke.mindustry.input.AndroidInput; import io.anuke.mindustry.input.DesktopInput; @@ -36,9 +35,9 @@ import io.anuke.ucore.core.Inputs.DeviceType; import io.anuke.ucore.entities.Entities; import io.anuke.ucore.entities.EntityGroup; import io.anuke.ucore.graphics.Lines; -import io.anuke.ucore.util.Atlas; import io.anuke.ucore.modules.Module; import io.anuke.ucore.scene.ui.layout.Unit; +import io.anuke.ucore.util.Atlas; import io.anuke.ucore.util.Input; import io.anuke.ucore.util.InputProxy; import io.anuke.ucore.util.Mathf; @@ -87,7 +86,6 @@ public class Control extends Module{ public Control(){ if(Mindustry.args.contains("-debug", false)) Vars.debug = true; - saves = new Saves(); Inputs.useControllers(!Vars.gwt); diff --git a/core/src/io/anuke/mindustry/core/NetClient.java b/core/src/io/anuke/mindustry/core/NetClient.java index dba4b0ffa8..fcb29d510f 100644 --- a/core/src/io/anuke/mindustry/core/NetClient.java +++ b/core/src/io/anuke/mindustry/core/NetClient.java @@ -96,6 +96,7 @@ public class NetClient extends Module { UCore.log("Recieved world data: " + data.stream.available() + " bytes."); NetworkIO.loadWorld(data.stream); Vars.player.set(Vars.control.core.worldx(), Vars.control.core.worldy() - Vars.tilesize * 2); + UCore.log(Vars.control.core); gotData = true; @@ -103,6 +104,7 @@ public class NetClient extends Module { }); Net.handle(CustomMapPacket.class, packet -> { + UCore.log("Recieved custom map: " + packet.stream.available() + " bytes."); //custom map is always sent before world data Pixmap pixmap = NetworkIO.loadMap(packet.stream); diff --git a/core/src/io/anuke/mindustry/net/NetworkIO.java b/core/src/io/anuke/mindustry/net/NetworkIO.java index fdc4e5c25a..1a48926dfd 100644 --- a/core/src/io/anuke/mindustry/net/NetworkIO.java +++ b/core/src/io/anuke/mindustry/net/NetworkIO.java @@ -26,17 +26,40 @@ public class NetworkIO { public static void writeMap(Pixmap map, OutputStream os){ try(DataOutputStream stream = new DataOutputStream(os)){ - ByteBuffer buffer = (ByteBuffer) map.getPixels(); - UCore.log("Buffer position: " + buffer.position()); stream.writeShort(map.getWidth()); stream.writeShort(map.getHeight()); - for(int i = 0; i < map.getWidth() * map.getHeight(); i ++){ - int color = buffer.getInt(); + + int width = map.getWidth(); + int cap = map.getWidth() * map.getHeight(); + int pos = 0; + + while(pos < cap){ + int color = map.getPixel(pos % width, pos / width); byte id = ColorMapper.getColorID(color); + + int length = 1; + while(true){ + if(pos >= cap || length > 254){ + break; + } + + pos ++; + + int next = map.getPixel(pos % width, pos / width); + if(next != color){ + pos --; + break; + }else{ + length ++; + } + } + if(id == -1) id = 0; + stream.writeByte((byte)(length > 127 ? length - 256 : length)); stream.writeByte(id); + + pos ++; } - buffer.position(0); }catch (IOException e){ throw new RuntimeException(e); } @@ -47,21 +70,21 @@ public class NetworkIO { short width = stream.readShort(); short height = stream.readShort(); Pixmap pixmap = new Pixmap(width, height, Format.RGBA8888); - if(!Vars.gwt) { - ByteBuffer buffer = (ByteBuffer) pixmap.getPixels(); - buffer.position(0); - for (int i = 0; i < width * height; i++) { - byte id = stream.readByte(); - buffer.putInt(ColorMapper.getColorByID(id)); - } - }else{ - for(int i = 0; i < width * height; i++){ - byte id = stream.readByte(); - pixmap.drawPixel(i % width, i /width, ColorMapper.getColorByID(id)); + int pos = 0; + while(stream.available() > 0){ + int length = stream.readByte(); + byte id = stream.readByte(); + if(length < 0) length += 256; + int color = ColorMapper.getColorByID(id); + + for(int p = 0; p < length; p ++){ + pixmap.drawPixel(pos % width, pos / width,color); + pos ++; } } + return pixmap; }catch (IOException e){ throw new RuntimeException(e);