To be continued ...

This commit is contained in:
NgLamVN
2020-11-26 15:42:27 +07:00
committed by GitHub
48 changed files with 298 additions and 210 deletions

View File

@@ -21,6 +21,8 @@ jobs:
- name: Update docs - name: Update docs
run: | run: |
cd ../ cd ../
git config --global user.email "cli@github.com"
git config --global user.name "Github Actions"
git clone --depth=1 https://github.com/MindustryGame/docs.git git clone --depth=1 https://github.com/MindustryGame/docs.git
cp -a Mindustry/core/build/docs/javadoc/. docs/ cp -a Mindustry/core/build/docs/javadoc/. docs/
cd docs cd docs
@@ -48,12 +50,12 @@ jobs:
uses: svenstaro/upload-release-action@v2 uses: svenstaro/upload-release-action@v2
with: with:
repo_token: ${{ secrets.GITHUB_TOKEN }} repo_token: ${{ secrets.GITHUB_TOKEN }}
file: desktop/libs/Mindustry.jar file: desktop/build/libs/Mindustry.jar
tag: ${{ github.ref }} tag: ${{ github.ref }}
- name: Upload server artifacts - name: Upload server artifacts
uses: svenstaro/upload-release-action@v2 uses: svenstaro/upload-release-action@v2
with: with:
repo_token: ${{ secrets.GITHUB_TOKEN }} repo_token: ${{ secrets.GITHUB_TOKEN }}
file: server/libs/server-release.jar file: server/build/libs/server-release.jar
tag: ${{ github.ref }} tag: ${{ github.ref }}

View File

@@ -1,6 +1,6 @@
name: Tests name: Tests
on: [push] on: [push, workflow_dispatch]
jobs: jobs:
buildJava14: buildJava14:
@@ -15,6 +15,7 @@ jobs:
- name: Run unit tests - name: Run unit tests
run: ./gradlew test run: ./gradlew test
- name: Trigger BE build - name: Trigger BE build
if: ${{ github.repository == 'Anuken/Mindustry' }}
run: | run: |
git clone --depth=1 --branch=master https://github.com/Anuken/MindustryBuilds ../MindustryBuilds git clone --depth=1 --branch=master https://github.com/Anuken/MindustryBuilds ../MindustryBuilds
cd ../MindustryBuilds cd ../MindustryBuilds

View File

@@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
version="1.1"
id="svg542"
sodipodi:docname="planet.svg"
inkscape:version="1.0.1 (0767f8302a, 2020-10-17)">
<metadata
id="metadata548">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs546" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="2560"
inkscape:window-height="1316"
id="namedview544"
showgrid="false"
inkscape:pagecheckerboard="true"
inkscape:zoom="15.75"
inkscape:cx="-16.385458"
inkscape:cy="16.16535"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="svg542" />
<path
id="polygon2"
style="fill:#ffffff"
d="M 5.5 0 L 5 0.5 L 4.5 1 L 3.5 1 L 3 1.5 L 2.5 2 L 2 2.5 L 1.5 3 L 1 3.5 L 1 4.5 L 0.5 5 L 0 5.5 L 0 6.5 L 0 7.5 L 0 8.5 L 0 9.5 L 0 10.5 L 0.5 11 L 1 11.5 L 1 12.5 L 1.5 13 L 2 13.5 L 2.5 14 L 3 14.5 L 3.5 15 L 4.5 15 L 5 15.5 L 5.5 16 L 6.5 16 L 7.5 16 L 8.5 16 L 9.5 16 L 10.5 16 L 11 15.5 L 11.5 15 L 12.5 15 L 13 14.5 L 13.5 14 L 14 13.5 L 14.5 13 L 15 12.5 L 15 11.5 L 15.5 11 L 16 10.5 L 16 9.5 L 16 8.5 L 16 7.5 L 16 6.5 L 16 5.5 L 15.5 5 L 15 4.5 L 15 3.5 L 14.5 3 L 14 2.5 L 13.5 2 L 13 1.5 L 12.5 1 L 11.5 1 L 11 0.5 L 10.5 0 L 9.5 0 L 8.5 0 L 7.5 0 L 6.5 0 L 5.5 0 z M 6.5 1 L 7 1.5 L 7.5 2 L 8.5 2 L 9 2.5 L 9 3.5 L 9.5 4 L 10 4.5 L 10.5 5 L 11 5.5 L 11.5 6 L 12.5 6 L 13.5 6 L 14.5 6 L 15 6.5 L 15 7.5 L 15 8.5 L 15 9.5 L 14.5 10 L 14 10.5 L 14 11.5 L 13.5 12 L 13 12.5 L 12.5 13 L 12 13.5 L 11.5 14 L 10.5 14 L 10 14.5 L 9.5 15 L 8.5 15 L 8 14.5 L 7.5 14 L 7 13.5 L 7 12.5 L 7.5 12 L 8 11.5 L 8.5 11 L 9 10.5 L 9 9.5 L 9 8.5 L 8.5 8 L 8 7.5 L 7.5 7 L 6.5 7 L 5.5 7 L 4.5 7 L 4 7.5 L 3.5 8 L 3 8.5 L 2.5 9 L 2 9.5 L 1.5 10 L 1 9.5 L 1 8.5 L 1 7.5 L 1 6.5 L 1.5 6 L 2 5.5 L 2 4.5 L 2.5 4 L 3 3.5 L 3.5 3 L 4 2.5 L 4.5 2 L 5.5 2 L 6 1.5 L 6.5 1 z M 11.5 9 L 11 9.5 L 11 10.5 L 11.5 11 L 12.5 11 L 13 10.5 L 13 9.5 L 12.5 9 L 11.5 9 z " />
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 578 B

View File

@@ -1,2 +1,3 @@
mschxœ-k mschxњ-Ќ‹
1 „ÇMÅîуôPÅ В0 EoЧКєўТЏЄ®И ¶Ґ«Ёџ.CfІJ‡<NЗ*Ш»Г<C2BB>lцЮѕиmЖ0№ељзTжЂN)>]6!NОРьж0,)Ь‡&ЩІЌцbKqщЌу~И$њя+А­Vh¶•т №} ¶U
кwZР;¤$ґ ]Сґ…]P,(І»ЉЎkҐ№ъЕ¶,e

View File

@@ -230,6 +230,7 @@ disconnect.timeout = Timed out.
disconnect.data = Failed to load world data! disconnect.data = Failed to load world data!
cantconnect = Unable to join game ([accent]{0}[]). cantconnect = Unable to join game ([accent]{0}[]).
connecting = [accent]Connecting... connecting = [accent]Connecting...
reconnecting = [accent]Reconnecting...
connecting.data = [accent]Loading world data... connecting.data = [accent]Loading world data...
server.port = Port: server.port = Port:
server.addressinuse = Address already in use! server.addressinuse = Address already in use!

View File

@@ -19,8 +19,8 @@ screenshot.invalid = 맵이 너무 커서 스크린샷에 사용될 메모리가
gameover = 게임 오버 gameover = 게임 오버
gameover.pvp = [accent]{0}[] 팀이 승리했습니다! gameover.pvp = [accent]{0}[] 팀이 승리했습니다!
highscore = [accent]새로운 최고 점수! highscore = [accent]새로운 최고 점수!
copied = 복사됨. copied = 복사
indev.popup = 현재 [accent]v6[] 버전은 [accent]알파[] 단계입니다.\n[lightgray]이 말은:[]\n- [scarlet]캠페인이 아직 완전히 개발되지 않음[]\n- 몇몇 컨텐츠가 빠짐\n- 대부분의 [scarlet]유닛 AI[]가 작동하지 않음\n- 많은 유닛들이 아직 미완성\n- 보이는 것은 모두 바뀌거나 제거될 수 있음\n\n[accent]Github[] 에서 버그 또는 강제종료 오류를 신고 해 주세요. indev.popup = 현재 [accent]v6[] 버전은 [accent]베타[] 단계입니다.\n\n[accent]Github[] 에서 버그 또는 강제종료 오류를 신고 해 주세요.
indev.notready = 이 부분은 아직 준비가 되지 않았습니다. indev.notready = 이 부분은 아직 준비가 되지 않았습니다.
load.sound = 소리 load.sound = 소리
@@ -71,15 +71,15 @@ map.delete = 정말로 "[accent]{0}[]" 맵을 삭제하시겠습니까?
level.highscore = 최고 점수: [accent]{0} level.highscore = 최고 점수: [accent]{0}
level.select = 맵 선택 level.select = 맵 선택
level.mode = 게임 모드: level.mode = 게임 모드:
coreattack = < 코어가 공격 받고 있습니다! > coreattack = < 코어가 공격 받고 있습니다! >
nearpoint = [[ [scarlet]즉시 스폰지점에서 떠나세요[] ]\n전멸 임박 nearpoint = [[ [scarlet]즉시 스폰지점에서 떠나세요[] ]\n인근 건물들과 유닛들은 초토화됩니다!
database = 코어 데이터베이스 database = 코어 데이터베이스
savegame = 게임 저장 savegame = 게임 저장
loadgame = 게임 불러오기 loadgame = 게임 불러오기
joingame = 게임 참여 joingame = 게임 참여
customgame = 사용자 지정 게임 customgame = 사용자 지정 게임
newgame = 새 게임 newgame = 새 게임
none = <없음> none = < 없음 >
minimap = 미니맵 minimap = 미니맵
position = 위치 position = 위치
close = 닫기 close = 닫기
@@ -291,8 +291,8 @@ waiting = [lightgray]대기중...
waiting.players = 상대 플레이어를 기다리는 중... waiting.players = 상대 플레이어를 기다리는 중...
wave.enemies = [lightgray]적 유닛 {0}명 남음 wave.enemies = [lightgray]적 유닛 {0}명 남음
wave.enemy = [lightgray]{0}명 남음 wave.enemy = [lightgray]{0}명 남음
wave.guardianwarn = [accent]{0}[] 단계 후에 가디언이 접근합니다. wave.guardianwarn = [accent]{0}[] 단계 후에 수호자가 접근합니다.
wave.guardianwarn.one = [accent]{0}[] 단계 후에 가디언이 접근합니다. wave.guardianwarn.one = [accent]{0}[] 단계 후에 수호자가 접근합니다.
loadimage = 사진 불러오기 loadimage = 사진 불러오기
saveimage = 사진 저장 saveimage = 사진 저장
unknown = 알 수 없음 unknown = 알 수 없음
@@ -335,13 +335,13 @@ editor.center = 중앙
workshop = 창작마당 workshop = 창작마당
waves.title = 단계 waves.title = 단계
waves.remove = 삭제 waves.remove = 삭제
waves.never = 여기까지 유닛생성 waves.never = 여기까지 유닛 생성
waves.every = waves.every =
waves.waves = 단계마다 waves.waves = 단계마다
waves.perspawn = 마리 생성 waves.perspawn = 마리 생성
waves.shields = 보호막/단계 waves.shields = 방어막/단계
waves.to = 부터 waves.to = 부터
waves.guardian = 가디언 waves.guardian = 수호자
waves.preview = 미리보기 waves.preview = 미리보기
waves.edit = 편집 waves.edit = 편집
waves.copy = 클립보드로 복사 waves.copy = 클립보드로 복사
@@ -495,7 +495,7 @@ zone.objective = [lightgray]목표: [accent]{0}
zone.objective.survival = 생존 zone.objective.survival = 생존
zone.objective.attack = 적 코어 파괴 zone.objective.attack = 적 코어 파괴
add = 추가... add = 추가...
boss.health = 보스 체력 boss.health = 수호자 체력
connectfail = [scarlet]연결 오류:\n\n[accent]{0} connectfail = [scarlet]연결 오류:\n\n[accent]{0}
error.unreachable = 서버에 연결하지 못했습니다.\n서버 주소가 정확히 입력되었나요? error.unreachable = 서버에 연결하지 못했습니다.\n서버 주소가 정확히 입력되었나요?
@@ -522,11 +522,11 @@ sectors.resume = 재개
sectors.launch = 출격 sectors.launch = 출격
sectors.select = 선택 sectors.select = 선택
sectors.nonelaunch = [lightgray]없음 (sun) sectors.nonelaunch = [lightgray]없음 (sun)
sectors.rename = Rename Sector sectors.rename = 구역 명명
sector.missingresources = [scarlet]Insufficient Core Resources sector.missingresources = [scarlet]자원 부족
planet.serpulo.name = Serpulo planet.serpulo.name = 세르플
planet.sun.name = Sun planet.sun.name = 태양
sector.groundZero.name = 전초기지 sector.groundZero.name = 전초기지
sector.craters.name = 크레이터 sector.craters.name = 크레이터
@@ -561,26 +561,26 @@ settings.controls = 조작
settings.game = 게임 settings.game = 게임
settings.sound = 소리 settings.sound = 소리
settings.graphics = 그래픽 settings.graphics = 그래픽
settings.cleardata = 게임 데이터 초기화... settings.cleardata = 게임 데이터 초기화
settings.clear.confirm = 정말로 이 데이터를 지우시겠습니까?\n완료된 작업은 취소할 수 없습니다! settings.clear.confirm = 정말로 이 데이터를 지우시겠습니까?\n되돌릴 수 없습니다!
settings.clearall.confirm = [scarlet]경고![]\n이 작업은 저장된 맵, 맵파일, 잠금 해제된 목록과 키 매핑, 그리고 모든 데이터를 삭제합니다.\n확인 버튼을 다시 눌러 모든 데이터를 삭제하고 게임에서 나갑니다. settings.clearall.confirm = [scarlet]경고![]\n이 작업은 저장된 맵, 맵파일, 잠금 해제된 목록과 키 매핑, 그리고 모든 데이터를 삭제합니다.\n확인 버튼을 다시 눌러 모든 데이터를 삭제하고 게임에서 나갑니다.
settings.clearsaves.confirm = 정말로 모든 저장을 삭제 하시겠습니까? settings.clearsaves.confirm = 정말로 모든 저장된 파일들을 삭제하시겠습니까?
settings.clearsaves = 저장 초기화 settings.clearsaves = 저장 초기화
settings.clearresearch = Clear Research settings.clearresearch = 연구 초기화
settings.clearresearch.confirm = Are you sure you want to clear all of your campaign research? settings.clearresearch.confirm = 정말로 모든 연구를 삭제하시겠습니까?
settings.clearcampaignsaves = Clear Campaign Saves settings.clearcampaignsaves = 캠페인 맵 초기화
settings.clearcampaignsaves.confirm = Are you sure you want to clear all of your campaign saves? settings.clearcampaignsaves.confirm = 정말로 캠페인을 초기화하시겠습니까?
paused = [accent]< 일시정지 > paused = [accent]< 일시정지 >
clear = 초기화 clear = 초기화
banned = [scarlet]차단됨 banned = [scarlet]차단됨
unplaceable.sectorcaptured = [scarlet]점령된 구역이 필요합니다 unplaceable.sectorcaptured = [scarlet]구역 점령 필요
yes = yes =
no = 아니오 no = 아니오
info.title = 정보 info.title = 정보
error.title = [scarlet]오류가 발생했습니다. error.title = [scarlet]오류가 발생했습니다.
error.crashtitle = 오류가 발생했습니다 error.crashtitle = 오류가 발생했습니다
unit.nobuild = [scarlet]이 유닛은 건설할 수 없습니다. unit.nobuild = [scarlet]건설 불가
lastaccessed = [lightgray]마지막 접근: {0} lastaccessed = [lightgray]마지막 조작: {0}
block.unknown = [lightgray]??? block.unknown = [lightgray]???
stat.input = 입력 stat.input = 입력
@@ -588,70 +588,70 @@ stat.output = 출력
stat.booster = 가속 stat.booster = 가속
stat.tiles = 필요한 타일 stat.tiles = 필요한 타일
stat.affinities = 친화력 stat.affinities = 친화력
stat.powercapacity = Power Capacity stat.powercapacity = 전력량
stat.powershot = Power/Shot stat.powershot = 전력량/발
stat.damage = Damage stat.damage = 공격력
stat.targetsair = Targets Air stat.targetsair = 공중 공격
stat.targetsground = Targets Ground stat.targetsground = 지상 공격
stat.itemsmoved = Move Speed stat.itemsmoved = 이동 속도
stat.launchtime = Time Between Launches stat.launchtime = 발사 간격
stat.shootrange = Range stat.shootrange = 사거리
stat.size = Size stat.size = 크기
stat.displaysize = Display Size stat.displaysize = 화면 크기
stat.liquidcapacity = Liquid Capacity stat.liquidcapacity = 액체 수용량
stat.powerrange = Power Range stat.powerrange = 전선 길이
stat.linkrange = Link Range stat.linkrange = 감지 길이
stat.instructions = Instructions stat.instructions = 최대 명령어 수
stat.powerconnections = Max Connections stat.powerconnections = 최대 연결 개수
stat.poweruse = Power Use stat.poweruse = 전력 요구량
stat.powerdamage = Power/Damage stat.powerdamage = 전력량/피해량
stat.itemcapacity = Item Capacity stat.itemcapacity = 자원 수용량
stat.memorycapacity = Memory Capacity stat.memorycapacity = 변수 개수
stat.basepowergeneration = Base Power Generation stat.basepowergeneration = 기본 발전량
stat.productiontime = Production Time stat.productiontime = 소요 시간
stat.repairtime = Block Full Repair Time stat.repairtime = 건물 완전 복구 시간
stat.speedincrease = Speed Increase stat.speedincrease = 속도 증가
stat.range = Range stat.range = 사거리
stat.drilltier = Drillables stat.drilltier = 채굴 가능 자원
stat.drillspeed = Base Drill Speed stat.drillspeed = 기본 채굴 속도
stat.boosteffect = Boost Effect stat.boosteffect = 버프 효과
stat.maxunits = Max Active Units stat.maxunits = 최대 유닛 수
stat.health = Health stat.health = 체력
stat.buildtime = Build Time stat.buildtime = 건설 시간
stat.maxconsecutive = Max Consecutive stat.maxconsecutive = 최대 체인 길이
stat.buildcost = Build Cost stat.buildcost = 건설 비용
stat.inaccuracy = Inaccuracy stat.inaccuracy = 오차각
stat.shots = Shots stat.shots = 발사 당 탄
stat.reload = Shots/Second stat.reload = 발/초
stat.ammo = Ammo stat.ammo = 탄약
stat.shieldhealth = Shield Health stat.shieldhealth = 보호막 체력
stat.cooldowntime = Cooldown Time stat.cooldowntime = 쿨타임
stat.explosiveness = Explosiveness stat.explosiveness = 폭발성
stat.basedeflectchance = Base Deflect Chance stat.basedeflectchance = 기본 반사 확률
stat.lightningchance = Lightning Chance stat.lightningchance = 전격 확률
stat.lightningdamage = Lightning Damage stat.lightningdamage = 전격 공격량
stat.flammability = Flammability stat.flammability = 휘발성
stat.radioactivity = Radioactivity stat.radioactivity = 방사성
stat.heatcapacity = HeatCapacity stat.heatcapacity = 열용량
stat.viscosity = Viscosity stat.viscosity = 점성
stat.temperature = Temperature stat.temperature = 온도
stat.speed = Speed stat.speed = 속도
stat.buildspeed = Build Speed stat.buildspeed = 건설 속도
stat.minespeed = Mine Speed stat.minespeed = 채굴 속도
stat.minetier = Mine Tier stat.minetier = 채굴 티어
stat.payloadcapacity = Payload Capacity stat.payloadcapacity = 화물 수용량
stat.commandlimit = Command Limit stat.commandlimit = 지휘 한계
stat.abilities = Abilities stat.abilities = 능력
ability.forcefield = Force Field ability.forcefield = 보호막
ability.repairfield = Repair Field ability.repairfield = 수리장
ability.statusfield = Status Field ability.statusfield = 버프장
ability.unitspawn = {0} Factory ability.unitspawn = {0} 공장
ability.shieldregenfield = Shield Regen Field ability.shieldregenfield = 방어막 복구장
bar.drilltierreq = 더 좋은 드릴이 필요 bar.drilltierreq = 더 좋은 드릴이 필요
bar.noresources = 자원 부족 bar.noresources = 자원 부족
bar.corereq = 코어 기지 필요 bar.corereq = 코어 필요
bar.drillspeed = 드릴 속도: {0}/s bar.drillspeed = 드릴 속도: {0}/s
bar.pumpspeed = 펌프 속도: {0}/s bar.pumpspeed = 펌프 속도: {0}/s
bar.efficiency = 효율: {0}% bar.efficiency = 효율: {0}%
@@ -688,7 +688,7 @@ bullet.multiplier = [stat]{0}[lightgray]x 탄약 배수
bullet.reload = [stat]{0}[lightgray]x 발사 속도 bullet.reload = [stat]{0}[lightgray]x 발사 속도
unit.blocks = 블록 unit.blocks = 블록
unit.blockssquared = blocks² unit.blockssquared = 블록²
unit.powersecond = 전력/초 unit.powersecond = 전력/초
unit.liquidsecond = 액체/초 unit.liquidsecond = 액체/초
unit.itemssecond = 개/초 unit.itemssecond = 개/초
@@ -701,7 +701,7 @@ unit.persecond = /초
unit.perminute = /분 unit.perminute = /분
unit.timesspeed = x 배 unit.timesspeed = x 배
unit.percent = % unit.percent = %
unit.shieldhealth = 보호막 체력 unit.shieldhealth = 방어막 체력
unit.items = 자원 unit.items = 자원
unit.thousands = unit.thousands =
unit.millions = 백만 unit.millions = 백만
@@ -711,7 +711,7 @@ category.power = 전력
category.liquids = 액체 category.liquids = 액체
category.items = 자원 category.items = 자원
category.crafting = 입력/출력 category.crafting = 입력/출력
category.function = Function category.function = 기능
category.optional = 보조 자원 category.optional = 보조 자원
setting.landscape.name = 가로화면 잠금 setting.landscape.name = 가로화면 잠금
setting.shadows.name = 그림자 setting.shadows.name = 그림자
@@ -722,7 +722,7 @@ setting.flow.name = 자원 흐름량 표시
setting.buildautopause.name = 건설 자동 일시정지 setting.buildautopause.name = 건설 자동 일시정지
setting.animatedwater.name = 액체 애니메이션 효과 setting.animatedwater.name = 액체 애니메이션 효과
setting.animatedshields.name = 보호막 애니메이션 효과 setting.animatedshields.name = 보호막 애니메이션 효과
setting.antialias.name = 안티 에일리어싱[lightgray] (재시작 필요)[] setting.antialias.name = 위신호 제거 필터[lightgray] (재시작 필요)[]
setting.playerindicators.name = 플레이어 위치 표시기 setting.playerindicators.name = 플레이어 위치 표시기
setting.indicators.name = 적 위치 표시기 setting.indicators.name = 적 위치 표시기
setting.autotarget.name = 자동 조준 setting.autotarget.name = 자동 조준
@@ -734,10 +734,10 @@ setting.fpscap.text = {0} FPS
setting.uiscale.name = UI 스케일링[lightgray] (재시작 필요)[] setting.uiscale.name = UI 스케일링[lightgray] (재시작 필요)[]
setting.swapdiagonal.name = 항상 대각선 배치 setting.swapdiagonal.name = 항상 대각선 배치
setting.difficulty.training = 훈련 setting.difficulty.training = 훈련
setting.difficulty.easy = 쉬움 setting.difficulty.easy = 무난
setting.difficulty.normal = 보통 setting.difficulty.normal = 보통
setting.difficulty.hard = 어려움 setting.difficulty.hard = 혼돈
setting.difficulty.insane = 미침 setting.difficulty.insane = 박멸
setting.difficulty.name = 난이도: setting.difficulty.name = 난이도:
setting.screenshake.name = 화면 흔들림 setting.screenshake.name = 화면 흔들림
setting.effects.name = 효과 보임 setting.effects.name = 효과 보임
@@ -769,7 +769,7 @@ setting.savecreate.name = 자동 저장 활성화
setting.publichost.name = 멀티플레이 공용 서버로 표시 setting.publichost.name = 멀티플레이 공용 서버로 표시
setting.playerlimit.name = 플레이어 제한 setting.playerlimit.name = 플레이어 제한
setting.chatopacity.name = 채팅창 투명도 setting.chatopacity.name = 채팅창 투명도
setting.lasersopacity.name = 력 레이저 투명도 setting.lasersopacity.name = 투명도
setting.bridgeopacity.name = 터널 투명도 setting.bridgeopacity.name = 터널 투명도
setting.playerchat.name = 채팅 말풍선 표시 setting.playerchat.name = 채팅 말풍선 표시
public.confirm = 게임을 모두에게 공개하시겠습니까?\n[accent]모든 플레이어가 게임에 참여할 수 있습니다.\n[lightgray]설정->게임->멀티플레이 공용 서버로 표시에서 나중에 변경할 수 있습니다.\n\n[sky]번역자 추가[]\n[accent]친구끼리 하려고 이 기능을 활성화 한 뒤에, 친구 외에 다른 플레이어가 들어왔을 때\n해당 플레이어를 차단하는 행위는 비매너를 넘어서는 얌체 행위 그 자체입니다.\n정말로 [scarlet]많은 다른 플레이어들이 오길 원한다[]면 확인하세요. public.confirm = 게임을 모두에게 공개하시겠습니까?\n[accent]모든 플레이어가 게임에 참여할 수 있습니다.\n[lightgray]설정->게임->멀티플레이 공용 서버로 표시에서 나중에 변경할 수 있습니다.\n\n[sky]번역자 추가[]\n[accent]친구끼리 하려고 이 기능을 활성화 한 뒤에, 친구 외에 다른 플레이어가 들어왔을 때\n해당 플레이어를 차단하는 행위는 비매너를 넘어서는 얌체 행위 그 자체입니다.\n정말로 [scarlet]많은 다른 플레이어들이 오길 원한다[]면 확인하세요.
@@ -794,8 +794,8 @@ keybind.clear_building.name = 설계도 초기화
keybind.press = 키를 누르세요... keybind.press = 키를 누르세요...
keybind.press.axis = 마우스 휠 또는 키를 누르세요... keybind.press.axis = 마우스 휠 또는 키를 누르세요...
keybind.screenshot.name = 맵 스크린샷 keybind.screenshot.name = 맵 스크린샷
keybind.toggle_power_lines.name = 력 레이저 토글 keybind.toggle_power_lines.name = 선 가시도 설정
keybind.toggle_block_status.name = 블록 상태 토글 keybind.toggle_block_status.name = 블록 상태 가시도
keybind.move_x.name = X축 이동 keybind.move_x.name = X축 이동
keybind.move_y.name = Y축 이동 keybind.move_y.name = Y축 이동
keybind.mouse_move.name = 커서를 따라서 이동 keybind.mouse_move.name = 커서를 따라서 이동

View File

@@ -14,8 +14,6 @@ import mindustry.world.blocks.*;
import mindustry.world.blocks.campaign.*; import mindustry.world.blocks.campaign.*;
import mindustry.world.blocks.defense.*; import mindustry.world.blocks.defense.*;
import mindustry.world.blocks.defense.turrets.*; import mindustry.world.blocks.defense.turrets.*;
import mindustry.world.blocks.defense.turrets.PointDefenseTurret;
import mindustry.world.blocks.defense.turrets.TractorBeamTurret;
import mindustry.world.blocks.distribution.*; import mindustry.world.blocks.distribution.*;
import mindustry.world.blocks.environment.*; import mindustry.world.blocks.environment.*;
import mindustry.world.blocks.experimental.*; import mindustry.world.blocks.experimental.*;
@@ -1216,18 +1214,18 @@ public class Blocks implements ContentList{
requirements(Category.power, with(Items.lead, 100, Items.silicon, 75, Items.phaseFabric, 25, Items.plastanium, 75, Items.thorium, 50)); requirements(Category.power, with(Items.lead, 100, Items.silicon, 75, Items.phaseFabric, 25, Items.plastanium, 75, Items.thorium, 50));
size = 2; size = 2;
powerProduction = 4.5f; powerProduction = 4.5f;
itemDuration = 60 * 15f; itemDuration = 60 * 14f;
}}; }};
solarPanel = new SolarGenerator("solar-panel"){{ solarPanel = new SolarGenerator("solar-panel"){{
requirements(Category.power, with(Items.lead, 10, Items.silicon, 15)); requirements(Category.power, with(Items.lead, 10, Items.silicon, 15));
powerProduction = 0.08f; powerProduction = 0.1f;
}}; }};
largeSolarPanel = new SolarGenerator("solar-panel-large"){{ largeSolarPanel = new SolarGenerator("solar-panel-large"){{
requirements(Category.power, with(Items.lead, 100, Items.silicon, 145, Items.phaseFabric, 15)); requirements(Category.power, with(Items.lead, 80, Items.silicon, 110, Items.phaseFabric, 15));
size = 3; size = 3;
powerProduction = 1f; powerProduction = 1.3f;
}}; }};
thoriumReactor = new NuclearReactor("thorium-reactor"){{ thoriumReactor = new NuclearReactor("thorium-reactor"){{
@@ -1515,7 +1513,7 @@ public class Blocks implements ContentList{
flags = EnumSet.of(BlockFlag.turret, BlockFlag.extinguisher); flags = EnumSet.of(BlockFlag.turret, BlockFlag.extinguisher);
}}; }};
lancer = new ChargeTurret("lancer"){{ lancer = new PowerTurret("lancer"){{
requirements(Category.turret, with(Items.copper, 25, Items.lead, 50, Items.silicon, 45)); requirements(Category.turret, with(Items.copper, 25, Items.lead, 50, Items.silicon, 45));
range = 165f; range = 165f;
chargeTime = 40f; chargeTime = 40f;

View File

@@ -512,8 +512,7 @@ public class TechTree implements ContentList{
new Research(groundFactory), new Research(groundFactory),
new Research(additiveReconstructor), new Research(additiveReconstructor),
new Research(airFactory), new Research(airFactory),
new Research(door), new Research(door)
new Research(waterExtractor)
), () -> { ), () -> {
}); });

View File

@@ -41,7 +41,7 @@ public class NetClient implements ApplicationListener{
private boolean connecting = false; private boolean connecting = false;
/** If true, no message will be shown on disconnect. */ /** If true, no message will be shown on disconnect. */
private boolean quiet = false; private boolean quiet = false;
/** Whether to supress disconnect events completely.*/ /** Whether to suppress disconnect events completely.*/
private boolean quietReset = false; private boolean quietReset = false;
/** Counter for data timeout. */ /** Counter for data timeout. */
private float timeoutTime = 0f; private float timeoutTime = 0f;
@@ -258,6 +258,11 @@ public class NetClient implements ApplicationListener{
netClient.disconnectQuietly(); netClient.disconnectQuietly();
logic.reset(); logic.reset();
if(reason == KickReason.serverRestarting){
ui.join.reconnect();
return;
}
if(!reason.quiet){ if(!reason.quiet){
if(reason.extraText() != null){ if(reason.extraText() != null){
ui.showText(reason.toString(), reason.extraText()); ui.showText(reason.toString(), reason.extraText());

View File

@@ -422,7 +422,7 @@ public class NetServer implements ApplicationListener{
currentlyKicking[0] = session; currentlyKicking[0] = session;
} }
}else{ }else{
player.sendMessage("[scarlet]No player[orange]'" + args[0] + "'[scarlet] found."); player.sendMessage("[scarlet]No player [orange]'" + args[0] + "'[scarlet] found.");
} }
} }
}); });

View File

@@ -31,7 +31,7 @@ public abstract class Content implements Comparable<Content>, Disposable{
*/ */
public void load(){} public void load(){}
/** @return whether an error ocurred during mod loading. */ /** @return whether an error occurred during mod loading. */
public boolean hasErrored(){ public boolean hasErrored(){
return minfo.error != null; return minfo.error != null;
} }

View File

@@ -110,7 +110,7 @@ public abstract class UnlockableContent extends MappableContent{
/** Makes this piece of content unlocked; if it already unlocked, nothing happens. */ /** Makes this piece of content unlocked; if it already unlocked, nothing happens. */
public void unlock(){ public void unlock(){
if(!unlocked()){ if(!net.client() && !unlocked()){
unlocked = true; unlocked = true;
Core.settings.put(name + "-unlocked", true); Core.settings.put(name + "-unlocked", true);

View File

@@ -91,6 +91,10 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc, Statusc{
mount.bullet.time = mount.bullet.lifetime - 10f; mount.bullet.time = mount.bullet.lifetime - 10f;
mount.bullet = null; mount.bullet = null;
} }
if(mount.sound != null){
mount.sound.stop();
}
} }
} }

View File

@@ -18,6 +18,7 @@ public class EventType{
impactPower, impactPower,
thoriumReactorOverheat, thoriumReactorOverheat,
fireExtinguish, fireExtinguish,
acceleratorUse,
newGame, newGame,
tutorialComplete, tutorialComplete,
flameAmmo, flameAmmo,

View File

@@ -286,7 +286,8 @@ public abstract class SaveVersion extends SaveFileReader{
public void writeEntities(DataOutput stream) throws IOException{ public void writeEntities(DataOutput stream) throws IOException{
//write team data with entities. //write team data with entities.
Seq<TeamData> data = state.teams.getActive().and(Team.sharded.data()); Seq<TeamData> data = state.teams.getActive().copy();
if(!data.contains(Team.sharded.data())) data.add(Team.sharded.data());
stream.writeInt(data.size); stream.writeInt(data.size);
for(TeamData team : data){ for(TeamData team : data){
stream.writeInt(team.team.id); stream.writeInt(team.team.id);
@@ -313,12 +314,23 @@ public abstract class SaveVersion extends SaveFileReader{
public void readEntities(DataInput stream) throws IOException{ public void readEntities(DataInput stream) throws IOException{
int teamc = stream.readInt(); int teamc = stream.readInt();
for(int i = 0; i < teamc; i++){ for(int i = 0; i < teamc; i++){
Team team = Team.get(stream.readInt()); Team team = Team.get(stream.readInt());
TeamData data = team.data(); TeamData data = team.data();
int blocks = stream.readInt(); int blocks = stream.readInt();
data.blocks.clear();
data.blocks.ensureCapacity(Math.min(blocks, 1000));
var reads = Reads.get(stream);
var set = new IntSet();
for(int j = 0; j < blocks; j++){ for(int j = 0; j < blocks; j++){
data.blocks.addLast(new BlockPlan(stream.readShort(), stream.readShort(), stream.readShort(), content.block(stream.readShort()).id, TypeIO.readObject(Reads.get(stream)))); short x = stream.readShort(), y = stream.readShort(), rot = stream.readShort(), bid = stream.readShort();
var obj = TypeIO.readObject(reads);
//cannot have two in the same position
if(set.add(Point2.pack(x, y))){
data.blocks.addLast(new BlockPlan(x, y, rot, content.block(bid).id, obj));
}
} }
} }

View File

@@ -677,7 +677,7 @@ public class Mods implements Loadable{
public Seq<String> missingDependencies = new Seq<>(); public Seq<String> missingDependencies = new Seq<>();
/** Script files to run. */ /** Script files to run. */
public Seq<Fi> scripts = new Seq<>(); public Seq<Fi> scripts = new Seq<>();
/** Content with intialization code. */ /** Content with initialization code. */
public ObjectSet<Content> erroredContent = new ObjectSet<>(); public ObjectSet<Content> erroredContent = new ObjectSet<>();
/** Current state of this mod. */ /** Current state of this mod. */
public ModState state = ModState.enabled; public ModState state = ModState.enabled;
@@ -708,7 +708,7 @@ public class Mods implements Loadable{
return !erroredContent.isEmpty(); return !erroredContent.isEmpty();
} }
/** @return whether this mod is supported by the game verison */ /** @return whether this mod is supported by the game version */
public boolean isSupported(){ public boolean isSupported(){
if(isOutdated()) return false; if(isOutdated()) return false;

View File

@@ -8,6 +8,7 @@ import arc.scene.ui.*;
import arc.scene.ui.layout.*; import arc.scene.ui.layout.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
import arc.util.Timer.*;
import arc.util.serialization.*; import arc.util.serialization.*;
import mindustry.*; import mindustry.*;
import mindustry.core.*; import mindustry.core.*;
@@ -33,6 +34,10 @@ public class JoinDialog extends BaseDialog{
int refreshes; int refreshes;
boolean showHidden; boolean showHidden;
String lastIp;
int lastPort;
Task ping;
public JoinDialog(){ public JoinDialog(){
super("@joingame"); super("@joingame");
@@ -445,13 +450,34 @@ public class JoinDialog extends BaseDialog{
logic.reset(); logic.reset();
net.reset(); net.reset();
Vars.netClient.beginConnecting(); Vars.netClient.beginConnecting();
net.connect(ip, port, () -> { net.connect(lastIp = ip, lastPort = port, () -> {
hide(); hide();
add.hide(); add.hide();
}); });
}); });
} }
public void reconnect(){
if(lastIp == null || lastIp.isEmpty()) return;
ui.loadfrag.show("@reconnecting");
ping = Timer.schedule(() -> {
net.pingHost(lastIp, lastPort, host -> {
if(ping == null) return;
ping.cancel();
ping = null;
connect(lastIp, lastPort);
}, exception -> {});
}, 1, 1);
ui.loadfrag.setButton(() -> {
ui.loadfrag.hide();
if(ping == null) return;
ping.cancel();
ping = null;
});
}
void safeConnect(String ip, int port, int version){ void safeConnect(String ip, int port, int version){
if(version != Version.build && Version.build != -1 && version != -1){ if(version != Version.build && Version.build != -1 && version != -1){
ui.showInfo("[scarlet]" + (version > Version.build ? KickReason.clientOutdated : KickReason.serverOutdated).toString() + "\n[]" + ui.showInfo("[scarlet]" + (version > Version.build ? KickReason.clientOutdated : KickReason.serverOutdated).toString() + "\n[]" +

View File

@@ -140,6 +140,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
return this; return this;
} }
rebuildButtons();
mode = look; mode = look;
selected = hovered = launchSector = null; selected = hovered = launchSector = null;
launching = false; launching = false;

View File

@@ -1,5 +1,6 @@
package mindustry.world.blocks.campaign; package mindustry.world.blocks.campaign;
import arc.*;
import arc.Graphics.*; import arc.Graphics.*;
import arc.Graphics.Cursor.*; import arc.Graphics.Cursor.*;
import arc.graphics.g2d.*; import arc.graphics.g2d.*;
@@ -8,6 +9,7 @@ import arc.scene.ui.layout.*;
import arc.util.*; import arc.util.*;
import mindustry.annotations.Annotations.*; import mindustry.annotations.Annotations.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.game.EventType.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.graphics.*; import mindustry.graphics.*;
import mindustry.type.*; import mindustry.type.*;
@@ -91,6 +93,7 @@ public class Accelerator extends Block{
if(!state.isCampaign() || !consValid()) return; if(!state.isCampaign() || !consValid()) return;
ui.showInfo("@indev.campaign"); ui.showInfo("@indev.campaign");
Events.fire(Trigger.acceleratorUse);
} }
@Override @Override

View File

@@ -48,6 +48,7 @@ public class ForceProjector extends Block{
super(name); super(name);
update = true; update = true;
solid = true; solid = true;
group = BlockGroup.projectors;
hasPower = true; hasPower = true;
hasLiquids = true; hasLiquids = true;
hasItems = true; hasItems = true;

View File

@@ -31,6 +31,7 @@ public class MendProjector extends Block{
super(name); super(name);
solid = true; solid = true;
update = true; update = true;
group = BlockGroup.projectors;
hasPower = true; hasPower = true;
hasItems = true; hasItems = true;
} }

View File

@@ -32,6 +32,7 @@ public class OverdriveProjector extends Block{
super(name); super(name);
solid = true; solid = true;
update = true; update = true;
group = BlockGroup.projectors;
hasPower = true; hasPower = true;
hasItems = true; hasItems = true;
canOverdrive = false; canOverdrive = false;

View File

@@ -1,63 +0,0 @@
package mindustry.world.blocks.defense.turrets;
import arc.audio.*;
import arc.math.*;
import arc.util.*;
import mindustry.content.*;
import mindustry.entities.*;
import mindustry.entities.bullet.*;
import mindustry.type.*;
import mindustry.gen.*;
import static mindustry.Vars.*;
public class ChargeTurret extends PowerTurret{
public float chargeTime = 30f;
public int chargeEffects = 5;
public float chargeMaxDelay = 10f;
public Effect chargeEffect = Fx.none;
public Effect chargeBeginEffect = Fx.none;
public Sound chargeSound = Sounds.none;
public ChargeTurret(String name){
super(name);
}
public class ChargeTurretBuild extends PowerTurretBuild{
public boolean shooting;
@Override
public void shoot(BulletType ammo){
useAmmo();
tr.trns(rotation, size * tilesize / 2f);
chargeBeginEffect.at(x + tr.x, y + tr.y, rotation);
chargeSound.at(x + tr.x, y + tr.y, 1);
for(int i = 0; i < chargeEffects; i++){
Time.run(Mathf.random(chargeMaxDelay), () -> {
if(!isValid()) return;
tr.trns(rotation, size * tilesize / 2f);
chargeEffect.at(x + tr.x, y + tr.y, rotation);
});
}
shooting = true;
Time.run(chargeTime, () -> {
if(!isValid()) return;
tr.trns(rotation, size * tilesize / 2f);
recoil = recoilAmount;
heat = 1f;
bullet(ammo, rotation + Mathf.range(inaccuracy));
effects();
shooting = false;
});
}
@Override
public boolean shouldTurn(){
return !shooting;
}
}
}

View File

@@ -40,6 +40,7 @@ public abstract class Turret extends ReloadTurret{
public Effect ammoUseEffect = Fx.none; public Effect ammoUseEffect = Fx.none;
public Sound shootSound = Sounds.shoot; public Sound shootSound = Sounds.shoot;
//general info
public int maxAmmo = 30; public int maxAmmo = 30;
public int ammoPerShot = 1; public int ammoPerShot = 1;
public float ammoEjectBack = 1f; public float ammoEjectBack = 1f;
@@ -61,6 +62,14 @@ public abstract class Turret extends ReloadTurret{
public boolean targetAir = true; public boolean targetAir = true;
public boolean targetGround = true; public boolean targetGround = true;
//charging
public float chargeTime = -1f;
public int chargeEffects = 5;
public float chargeMaxDelay = 10f;
public Effect chargeEffect = Fx.none;
public Effect chargeBeginEffect = Fx.none;
public Sound chargeSound = Sounds.none;
public Sortf unitSort = Unit::dst2; public Sortf unitSort = Unit::dst2;
protected Vec2 tr = new Vec2(); protected Vec2 tr = new Vec2();
@@ -136,7 +145,7 @@ public abstract class Turret extends ReloadTurret{
public @Nullable Posc target; public @Nullable Posc target;
public Vec2 targetPos = new Vec2(); public Vec2 targetPos = new Vec2();
public BlockUnitc unit = Nulls.blockUnit; public BlockUnitc unit = Nulls.blockUnit;
public boolean wasShooting; public boolean wasShooting, charging;
@Override @Override
public void created(){ public void created(){
@@ -313,7 +322,7 @@ public abstract class Turret extends ReloadTurret{
} }
public boolean shouldTurn(){ public boolean shouldTurn(){
return true; return !charging;
} }
/** Consume ammo and return a type. */ /** Consume ammo and return a type. */
@@ -352,11 +361,37 @@ public abstract class Turret extends ReloadTurret{
} }
protected void shoot(BulletType type){ protected void shoot(BulletType type){
recoil = recoilAmount;
heat = 1f;
//when burst spacing is enabled, use the burst pattern //when charging is enabled, use the charge shoot pattern
if(burstSpacing > 0.0001f){ if(chargeTime > 0){
useAmmo();
tr.trns(rotation, size * tilesize / 2f);
chargeBeginEffect.at(x + tr.x, y + tr.y, rotation);
chargeSound.at(x + tr.x, y + tr.y, 1);
for(int i = 0; i < chargeEffects; i++){
Time.run(Mathf.random(chargeMaxDelay), () -> {
if(!isValid()) return;
tr.trns(rotation, size * tilesize / 2f);
chargeEffect.at(x + tr.x, y + tr.y, rotation);
});
}
charging = true;
Time.run(chargeTime, () -> {
if(!isValid()) return;
tr.trns(rotation, size * tilesize / 2f);
recoil = recoilAmount;
heat = 1f;
bullet(type, rotation + Mathf.range(inaccuracy));
effects();
charging = false;
});
//when burst spacing is enabled, use the burst pattern
}else if(burstSpacing > 0.0001f){
for(int i = 0; i < shots; i++){ for(int i = 0; i < shots; i++){
Time.run(burstSpacing * i, () -> { Time.run(burstSpacing * i, () -> {
if(!isValid() || !hasAmmo()) return; if(!isValid() || !hasAmmo()) return;
@@ -367,6 +402,8 @@ public abstract class Turret extends ReloadTurret{
bullet(type, rotation + Mathf.range(inaccuracy)); bullet(type, rotation + Mathf.range(inaccuracy));
effects(); effects();
useAmmo(); useAmmo();
recoil = recoilAmount;
heat = 1f;
}); });
} }
@@ -388,6 +425,8 @@ public abstract class Turret extends ReloadTurret{
shotCounter++; shotCounter++;
recoil = recoilAmount;
heat = 1f;
effects(); effects();
useAmmo(); useAmmo();
} }

View File

@@ -10,7 +10,6 @@ import arc.util.io.*;
import mindustry.annotations.Annotations.*; import mindustry.annotations.Annotations.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.entities.units.*; import mindustry.entities.units.*;
import mindustry.game.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.graphics.*; import mindustry.graphics.*;
import mindustry.type.*; import mindustry.type.*;

View File

@@ -178,7 +178,6 @@ public class StackConveyor extends Block implements Autotiler{
} }
proxUpdating = false; proxUpdating = false;
} }
} }
@Override @Override

View File

@@ -1,5 +1,5 @@
package mindustry.world.meta; package mindustry.world.meta;
public enum BlockGroup{ public enum BlockGroup{
none, walls, turrets, transportation, power, liquids, drills, storage, units, logic none, walls, projectors, turrets, transportation, power, liquids, drills, storage, units, logic
} }

View File

@@ -3,8 +3,7 @@ package mindustry.desktop.steam;
public enum SAchievement{ public enum SAchievement{
kill1kEnemies(SStat.unitsDestroyed, 1000), kill1kEnemies(SStat.unitsDestroyed, 1000),
kill100kEnemies(SStat.unitsDestroyed, 100_000), kill100kEnemies(SStat.unitsDestroyed, 100_000),
launch10kItems(SStat.itemsLaunched, 10_000), launch100kItems(SStat.itemsLaunched, 100_000),
launch1milItems(SStat.itemsLaunched, 1_000_000),
produce1kMin(SStat.maxProduction, 1000), produce1kMin(SStat.maxProduction, 1000),
produce20kMin(SStat.maxProduction, 20_000), produce20kMin(SStat.maxProduction, 20_000),
@@ -14,11 +13,7 @@ public enum SAchievement{
launch30Times(SStat.timesLaunched, 30), launch30Times(SStat.timesLaunched, 30),
captureBackground, captureBackground,
survive100Waves(SStat.maxWavesSurvived, 100), survive100Waves(SStat.maxWavesSurvived, 100),
//this seems near-impossible?
//survive500Waves(SStat.maxWavesSurvived, 500),
researchAll, researchAll,
//TODO
//useAllUnits,
shockWetEnemy, shockWetEnemy,
killEnemyPhaseWall, killEnemyPhaseWall,
researchRouter, researchRouter,
@@ -43,13 +38,12 @@ public enum SAchievement{
buildAllUnits(SStat.unitTypesBuilt, 30), buildAllUnits(SStat.unitTypesBuilt, 30),
buildT5, buildT5,
pickupT5, pickupT5,
activeAllT5,
active10Polys, active10Polys,
dieExclusion, dieExclusion,
drown, drown,
fillCoreAllCampaign, fillCoreAllCampaign,
hostServer10(SStat.maxPlayersServer, 10), hostServer10(SStat.maxPlayersServer, 10),
buildMeltdownSpectreForeshadow, buildMeltdownSpectre, //technically inaccurate
launchItemPad, launchItemPad,
chainRouters, chainRouters,
circleConveyor, circleConveyor,
@@ -61,6 +55,8 @@ public enum SAchievement{
coolTurret, coolTurret,
enablePixelation, enablePixelation,
openWiki, openWiki,
useAccelerator,
; ;
private final SStat stat; private final SStat stat;

View File

@@ -65,13 +65,6 @@ public class SStats implements SteamUserStatsCallback{
active10Polys.complete(); active10Polys.complete();
} }
tmpSet.clear();
tmpSet.addAll(t5s);
Groups.unit.each(u -> tmpSet.remove(u.type));
if(tmpSet.size == 0){
activeAllT5.complete();
}
for(Building entity : player.team().cores()){ for(Building entity : player.team().cores()){
if(!content.items().contains(i -> entity.items.get(i) < entity.block.itemCapacity)){ if(!content.items().contains(i -> entity.items.get(i) < entity.block.itemCapacity)){
fillCoreAllCampaign.complete(); fillCoreAllCampaign.complete();
@@ -141,7 +134,7 @@ public class SStats implements SteamUserStatsCallback{
if(blocksBuilt.add(e.tile.block().name)){ if(blocksBuilt.add(e.tile.block().name)){
if(blocksBuilt.contains("meltdown") && blocksBuilt.contains("spectre") && blocksBuilt.contains("foreshadow")){ if(blocksBuilt.contains("meltdown") && blocksBuilt.contains("spectre") && blocksBuilt.contains("foreshadow")){
buildMeltdownSpectreForeshadow.complete(); buildMeltdownSpectre.complete();
} }
save(); save();
@@ -215,6 +208,8 @@ public class SStats implements SteamUserStatsCallback{
} }
}); });
trigger(Trigger.acceleratorUse, useAccelerator);
trigger(Trigger.impactPower, powerupImpactReactor); trigger(Trigger.impactPower, powerupImpactReactor);
trigger(Trigger.flameAmmo, useFlameAmmo); trigger(Trigger.flameAmmo, useFlameAmmo);

View File

@@ -0,0 +1,10 @@
Only a few days left until stable 6.0 release now. The campaign should now be playable; I've done a playthrough and fixed all the bugs and irregularities I encountered.
Aside from internal modding API changes and potential bugfixes, 6.0 should not have any more additions.
- Added basalt boulder decoration block
- Added hint about generator use & power transfer
- Made power node placement smarter
- Buffed Lancer turret
Campaign:

View File

@@ -0,0 +1,2 @@
- Fixed broken blocks increasing exponentially, leading to runaway memory usage/lag
- Fixed incorrect planet dialog layout on certain devices

View File

@@ -1,3 +1,3 @@
org.gradle.daemon=true org.gradle.daemon=true
org.gradle.jvmargs=-Xms256m -Xmx1024m org.gradle.jvmargs=-Xms256m -Xmx1024m
archash=a61861127c9fea900f10b84a35be2369437be8f1 archash=7a2a357f6cfdc3725ce581093a0ced91f4474222

View File

@@ -1003,8 +1003,7 @@ public class ServerControl implements ApplicationListener{
private void logToFile(String text){ private void logToFile(String text){
if(currentLogFile != null && currentLogFile.length() > maxLogLength){ if(currentLogFile != null && currentLogFile.length() > maxLogLength){
String date = DateTimeFormatter.ofPattern("MM-dd-yyyy | HH:mm:ss").format(LocalDateTime.now()); currentLogFile.writeString("[End of log file. Date: " + dateTime.format(LocalDateTime.now()) + "]\n", true);
currentLogFile.writeString("[End of log file. Date: " + date + "]\n", true);
currentLogFile = null; currentLogFile = null;
} }