Compare commits
64 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2a6b0fd0ce | ||
|
|
47e622dee3 | ||
|
|
99125e9218 | ||
|
|
66918f0322 | ||
|
|
b8a2c609cb | ||
|
|
968277477a | ||
|
|
d06b32c20b | ||
|
|
525dc0cd7e | ||
|
|
8b6fc7f3ac | ||
|
|
8dd66fb942 | ||
|
|
e39eceee28 | ||
|
|
869c329fbf | ||
|
|
c8b425116e | ||
|
|
0a290d2e10 | ||
|
|
9863cbc991 | ||
|
|
91c50ae126 | ||
|
|
dae46ceb6d | ||
|
|
6b3919e8f7 | ||
|
|
20637fa358 | ||
|
|
1d8ec9abd9 | ||
|
|
d3f58c0e83 | ||
|
|
84474040c0 | ||
|
|
3fe4ae38b6 | ||
|
|
465219540c | ||
|
|
e1ddf115e0 | ||
|
|
56f1d0548e | ||
|
|
38471d68d7 | ||
|
|
17a571f22a | ||
|
|
dd9c3fc8d6 | ||
|
|
a70e29127b | ||
|
|
6be2b6021b | ||
|
|
488147759a | ||
|
|
9a7d359626 | ||
|
|
0437d50a5c | ||
|
|
f49f151901 | ||
|
|
2b8c11c451 | ||
|
|
11d864f2b5 | ||
|
|
977b55bf32 | ||
|
|
b06be81f1e | ||
|
|
93313664f0 | ||
|
|
25cb2b0abf | ||
|
|
b841af3a48 | ||
|
|
709f43b83c | ||
|
|
aabc094dd9 | ||
|
|
58acc0a970 | ||
|
|
c874089f27 | ||
|
|
4ac26d86f5 | ||
|
|
010e5341dc | ||
|
|
51790e0bf9 | ||
|
|
40b67349d9 | ||
|
|
735cb74483 | ||
|
|
bc55e43def | ||
|
|
084d7e8355 | ||
|
|
22e60612ac | ||
|
|
b271c4be32 | ||
|
|
f26b3358ef | ||
|
|
3d6390a76a | ||
|
|
ff20928bec | ||
|
|
59387389a4 | ||
|
|
b002d8b446 | ||
|
|
f5e06cca54 | ||
|
|
642b877ab0 | ||
|
|
8ee3f2b2e6 | ||
|
|
1637360952 |
4
.github/workflows/deployment.yml
vendored
4
.github/workflows/deployment.yml
vendored
@@ -50,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 }}
|
||||||
|
|
||||||
|
|||||||
4
.github/workflows/push.yml
vendored
4
.github/workflows/push.yml
vendored
@@ -1,6 +1,6 @@
|
|||||||
name: Tests
|
name: Tests
|
||||||
|
|
||||||
on: [push]
|
on: [push, workflow_dispatch]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
buildJava14:
|
buildJava14:
|
||||||
@@ -15,7 +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’ }}
|
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
|
||||||
|
|||||||
55
core/assets-raw/fontgen/extra/planet.svg
Normal file
55
core/assets-raw/fontgen/extra/planet.svg
Normal 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 |
BIN
core/assets-raw/icons/planet.png
Normal file
BIN
core/assets-raw/icons/planet.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 578 B |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,2 +1,3 @@
|
|||||||
mschxœ-‹k
|
mschxњ-Ќ‹
|
||||||
1„ÇMÅîуôPÅ
|
В0EoЧКєўТЏЄ®И ¶Ґ«Ёџ.CfІJ‡<N‚З*Ш»Г<C2BB>lцЮѕ–иmЖ0№ељзTжЂN)>]6!NОРьж0,‚)Ь‡&ЩІЌцbKqщЌу~И$њя+А‘Vh¶•т№} ¶U
|
||||||
|
кwZР'И;¤$ґ]СUфґ…]P,(І»Љ‘ЎkҐ№ъЕ¶,e
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -23,7 +23,7 @@ gameover.waiting = [accent]Waiting for next map...
|
|||||||
highscore = [accent]New highscore!
|
highscore = [accent]New highscore!
|
||||||
copied = Copied.
|
copied = Copied.
|
||||||
indev.notready = This part of the game isn't ready yet
|
indev.notready = This part of the game isn't ready yet
|
||||||
indev.campaign = [accent]You've reached the end of the campaign![]\n\nThis is as far as the content goes. Interplanetary travel will be added in future updates.
|
indev.campaign = [accent]Congratulations! You've reached the end of the campaign![]\n\nThis is as far as the content goes right now. Interplanetary travel will be added in future updates.
|
||||||
|
|
||||||
load.sound = Sounds
|
load.sound = Sounds
|
||||||
load.map = Maps
|
load.map = Maps
|
||||||
@@ -149,6 +149,9 @@ unlocked = New content unlocked!
|
|||||||
available = New research available!
|
available = New research available!
|
||||||
completed = [accent]Completed
|
completed = [accent]Completed
|
||||||
techtree = Tech Tree
|
techtree = Tech Tree
|
||||||
|
research.legacy = [accent]5.0[] research data found.\nDo you want to [accent]load this data[], or [accent]discard it[] and restart research in the new campaign (recommended)?
|
||||||
|
research.load = Load
|
||||||
|
research.discard = Discard
|
||||||
research.list = [lightgray]Research:
|
research.list = [lightgray]Research:
|
||||||
research = Research
|
research = Research
|
||||||
researched = [lightgray]{0} researched.
|
researched = [lightgray]{0} researched.
|
||||||
@@ -230,6 +233,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!
|
||||||
@@ -1456,7 +1460,7 @@ unit.reign.description = Fires a barrage of massive piercing bullets at all near
|
|||||||
unit.nova.description = Fires laser bolts that damage enemies and repair allied structures. Capable of flight.
|
unit.nova.description = Fires laser bolts that damage enemies and repair allied structures. Capable of flight.
|
||||||
unit.pulsar.description = Fires arcs of electricity that damage enemies and repair allied structures. Capable of flight.
|
unit.pulsar.description = Fires arcs of electricity that damage enemies and repair allied structures. Capable of flight.
|
||||||
unit.quasar.description = Fires piercing laser beams that damage enemies and repair allied structures. Capable of flight. Shielded.
|
unit.quasar.description = Fires piercing laser beams that damage enemies and repair allied structures. Capable of flight. Shielded.
|
||||||
unit.vela.description = Fires a massive continuous laser beam that damages enemies, causes fires and repair allied structures. Capable of flight.
|
unit.vela.description = Fires a massive continuous laser beam that damages enemies, causes fires and repairs allied structures. Capable of flight.
|
||||||
unit.corvus.description = Fires a massive laser blast that damages enemies and repairs allied structures. Can step over most terrain.
|
unit.corvus.description = Fires a massive laser blast that damages enemies and repairs allied structures. Can step over most terrain.
|
||||||
unit.crawler.description = Runs toward enemies and self-destructs, causing a large explosion.
|
unit.crawler.description = Runs toward enemies and self-destructs, causing a large explosion.
|
||||||
unit.atrax.description = Fires debilitating orbs of slag at ground targets. Can step over most terrain.
|
unit.atrax.description = Fires debilitating orbs of slag at ground targets. Can step over most terrain.
|
||||||
|
|||||||
@@ -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,8 +71,8 @@ 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 = 게임 불러오기
|
||||||
@@ -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 = 알 수 없음
|
||||||
@@ -339,9 +339,9 @@ 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 = 커서를 따라서 이동
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -88,7 +88,7 @@ public class Vars implements Loadable{
|
|||||||
/** duration of time between turns in ticks */
|
/** duration of time between turns in ticks */
|
||||||
public static final float turnDuration = 2 * Time.toMinutes;
|
public static final float turnDuration = 2 * Time.toMinutes;
|
||||||
/** chance of an invasion per turn, 1 = 100% */
|
/** chance of an invasion per turn, 1 = 100% */
|
||||||
public static final float baseInvasionChance = 1f / 75f;
|
public static final float baseInvasionChance = 1f / 100f;
|
||||||
/** how many turns have to pass before invasions start */
|
/** how many turns have to pass before invasions start */
|
||||||
public static final int invasionGracePeriod = 20;
|
public static final int invasionGracePeriod = 20;
|
||||||
/** min armor fraction damage; e.g. 0.05 = at least 5% damage */
|
/** min armor fraction damage; e.g. 0.05 = at least 5% damage */
|
||||||
|
|||||||
@@ -55,11 +55,12 @@ public class BaseAI{
|
|||||||
public void update(){
|
public void update(){
|
||||||
if(data.team.rules().aiCoreSpawn && timer.get(timerSpawn, 60 * 2.5f) && data.hasCore()){
|
if(data.team.rules().aiCoreSpawn && timer.get(timerSpawn, 60 * 2.5f) && data.hasCore()){
|
||||||
CoreBlock block = (CoreBlock)data.core().block;
|
CoreBlock block = (CoreBlock)data.core().block;
|
||||||
|
int coreUnits = Groups.unit.count(u -> u.team == data.team && u.type == block.unitType);
|
||||||
|
|
||||||
//create AI core unit
|
//create AI core unit(s)
|
||||||
if(!state.isEditor() && !Groups.unit.contains(u -> u.team() == data.team && u.type == block.unitType)){
|
if(!state.isEditor() && coreUnits < data.cores.size){
|
||||||
Unit unit = block.unitType.create(data.team);
|
Unit unit = block.unitType.create(data.team);
|
||||||
unit.set(data.core());
|
unit.set(data.cores.random());
|
||||||
unit.add();
|
unit.add();
|
||||||
Fx.spawn.at(unit);
|
Fx.spawn.at(unit);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ public class FormationAI extends AIController implements FormationMember{
|
|||||||
|
|
||||||
if(core != null && leader.mineTile.drop() != null && unit.within(core, unit.type.range) && !unit.acceptsItem(leader.mineTile.drop())){
|
if(core != null && leader.mineTile.drop() != null && unit.within(core, unit.type.range) && !unit.acceptsItem(leader.mineTile.drop())){
|
||||||
if(core.acceptStack(unit.stack.item, unit.stack.amount, unit) > 0){
|
if(core.acceptStack(unit.stack.item, unit.stack.amount, unit) > 0){
|
||||||
Call.transferItemTo(unit.stack.item, unit.stack.amount, unit.x, unit.y, core);
|
Call.transferItemTo(unit, unit.stack.item, unit.stack.amount, unit.x, unit.y, core);
|
||||||
|
|
||||||
unit.clearItem();
|
unit.clearItem();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ public class MinerAI extends AIController{
|
|||||||
|
|
||||||
if(unit.within(core, unit.type.range)){
|
if(unit.within(core, unit.type.range)){
|
||||||
if(core.acceptStack(unit.stack.item, unit.stack.amount, unit) > 0){
|
if(core.acceptStack(unit.stack.item, unit.stack.amount, unit) > 0){
|
||||||
Call.transferItemTo(unit.stack.item, unit.stack.amount, unit.x, unit.y, core);
|
Call.transferItemTo(unit, unit.stack.item, unit.stack.amount, unit.x, unit.y, core);
|
||||||
}
|
}
|
||||||
|
|
||||||
unit.clearItem();
|
unit.clearItem();
|
||||||
|
|||||||
@@ -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.*;
|
||||||
@@ -1221,13 +1219,13 @@ public class Blocks implements ContentList{
|
|||||||
|
|
||||||
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"){{
|
||||||
@@ -1390,7 +1388,7 @@ public class Blocks implements ContentList{
|
|||||||
size = 5;
|
size = 5;
|
||||||
|
|
||||||
unitCapModifier = 24;
|
unitCapModifier = 24;
|
||||||
researchCostMultiplier = 0.05f;
|
researchCostMultiplier = 0.06f;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
vault = new StorageBlock("vault"){{
|
vault = new StorageBlock("vault"){{
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ public class Bullets implements ContentList{
|
|||||||
waterShot, cryoShot, slagShot, oilShot, heavyWaterShot, heavyCryoShot, heavySlagShot, heavyOilShot,
|
waterShot, cryoShot, slagShot, oilShot, heavyWaterShot, heavyCryoShot, heavySlagShot, heavyOilShot,
|
||||||
|
|
||||||
//environment, misc.
|
//environment, misc.
|
||||||
damageLightning, damageLightningGround, fireball, basicFlame, pyraFlame, driverBolt, healBullet, healBulletBig;
|
damageLightning, damageLightningGround, fireball, basicFlame, pyraFlame, driverBolt;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void load(){
|
public void load(){
|
||||||
@@ -374,20 +374,6 @@ public class Bullets implements ContentList{
|
|||||||
knockback = 0.7f;
|
knockback = 0.7f;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
healBullet = new LaserBoltBulletType(5.2f, 13){{
|
|
||||||
healPercent = 3f;
|
|
||||||
collidesTeam = true;
|
|
||||||
backColor = Pal.heal;
|
|
||||||
frontColor = Color.white;
|
|
||||||
}};
|
|
||||||
|
|
||||||
healBulletBig = new LaserBoltBulletType(5.2f, 15){{
|
|
||||||
healPercent = 5.5f;
|
|
||||||
collidesTeam = true;
|
|
||||||
backColor = Pal.heal;
|
|
||||||
frontColor = Color.white;
|
|
||||||
}};
|
|
||||||
|
|
||||||
fireball = new BulletType(1f, 4){
|
fireball = new BulletType(1f, 4){
|
||||||
{
|
{
|
||||||
pierce = true;
|
pierce = true;
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ public class SectorPresets implements ContentList{
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
desolateRift = new SectorPreset("desolateRift", serpulo, 123){{
|
desolateRift = new SectorPreset("desolateRift", serpulo, 123){{
|
||||||
captureWave = 30;
|
captureWave = 18;
|
||||||
difficulty = 8;
|
difficulty = 8;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
|
|||||||
@@ -98,7 +98,6 @@ public class TechTree implements ContentList{
|
|||||||
node(platedConduit, () -> {
|
node(platedConduit, () -> {
|
||||||
|
|
||||||
});
|
});
|
||||||
});
|
|
||||||
|
|
||||||
node(rotaryPump, () -> {
|
node(rotaryPump, () -> {
|
||||||
node(thermalPump, () -> {
|
node(thermalPump, () -> {
|
||||||
@@ -109,6 +108,7 @@ public class TechTree implements ContentList{
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
|
||||||
node(graphitePress, () -> {
|
node(graphitePress, () -> {
|
||||||
node(pneumaticDrill, Seq.with(new SectorComplete(frozenForest)), () -> {
|
node(pneumaticDrill, Seq.with(new SectorComplete(frozenForest)), () -> {
|
||||||
@@ -422,7 +422,7 @@ public class TechTree implements ContentList{
|
|||||||
|
|
||||||
node(additiveReconstructor, Seq.with(new SectorComplete(biomassFacility)), () -> {
|
node(additiveReconstructor, Seq.with(new SectorComplete(biomassFacility)), () -> {
|
||||||
node(multiplicativeReconstructor, () -> {
|
node(multiplicativeReconstructor, () -> {
|
||||||
node(exponentialReconstructor, () -> {
|
node(exponentialReconstructor, Seq.with(new SectorComplete(overgrowth)), () -> {
|
||||||
node(tetrativeReconstructor, () -> {
|
node(tetrativeReconstructor, () -> {
|
||||||
|
|
||||||
});
|
});
|
||||||
@@ -471,7 +471,8 @@ public class TechTree implements ContentList{
|
|||||||
node(desolateRift, Seq.with(
|
node(desolateRift, Seq.with(
|
||||||
new SectorComplete(impact0078),
|
new SectorComplete(impact0078),
|
||||||
new Research(thermalGenerator),
|
new Research(thermalGenerator),
|
||||||
new Research(thoriumReactor)
|
new Research(thoriumReactor),
|
||||||
|
new Research(coreNucleus)
|
||||||
), () -> {
|
), () -> {
|
||||||
node(planetaryTerminal, Seq.with(
|
node(planetaryTerminal, Seq.with(
|
||||||
new SectorComplete(desolateRift),
|
new SectorComplete(desolateRift),
|
||||||
@@ -512,8 +513,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)
|
|
||||||
), () -> {
|
), () -> {
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -292,6 +292,7 @@ public class UnitTypes implements ContentList{
|
|||||||
shootSound = Sounds.lasershoot;
|
shootSound = Sounds.lasershoot;
|
||||||
|
|
||||||
bullet = new LaserBoltBulletType(5.2f, 14){{
|
bullet = new LaserBoltBulletType(5.2f, 14){{
|
||||||
|
lifetime = 37f;
|
||||||
healPercent = 5f;
|
healPercent = 5f;
|
||||||
collidesTeam = true;
|
collidesTeam = true;
|
||||||
backColor = Pal.heal;
|
backColor = Pal.heal;
|
||||||
@@ -311,7 +312,7 @@ public class UnitTypes implements ContentList{
|
|||||||
|
|
||||||
mineTier = 2;
|
mineTier = 2;
|
||||||
mineSpeed = 5f;
|
mineSpeed = 5f;
|
||||||
commandLimit = 8;
|
commandLimit = 9;
|
||||||
|
|
||||||
abilities.add(new ShieldRegenFieldAbility(20f, 40f, 60f * 5, 60f));
|
abilities.add(new ShieldRegenFieldAbility(20f, 40f, 60f * 5, 60f));
|
||||||
ammoType = AmmoTypes.power;
|
ammoType = AmmoTypes.power;
|
||||||
@@ -619,7 +620,7 @@ public class UnitTypes implements ContentList{
|
|||||||
drag = 0.4f;
|
drag = 0.4f;
|
||||||
hitSize = 12f;
|
hitSize = 12f;
|
||||||
rotateSpeed = 3f;
|
rotateSpeed = 3f;
|
||||||
health = 800;
|
health = 900;
|
||||||
immunities = ObjectSet.with(StatusEffects.burning, StatusEffects.melting);
|
immunities = ObjectSet.with(StatusEffects.burning, StatusEffects.melting);
|
||||||
legCount = 6;
|
legCount = 6;
|
||||||
legLength = 13f;
|
legLength = 13f;
|
||||||
@@ -650,7 +651,7 @@ public class UnitTypes implements ContentList{
|
|||||||
bullet = new SapBulletType(){{
|
bullet = new SapBulletType(){{
|
||||||
sapStrength = 0.4f;
|
sapStrength = 0.4f;
|
||||||
length = 75f;
|
length = 75f;
|
||||||
damage = 18;
|
damage = 20;
|
||||||
shootEffect = Fx.shootSmall;
|
shootEffect = Fx.shootSmall;
|
||||||
hitColor = color = Color.valueOf("bf92f9");
|
hitColor = color = Color.valueOf("bf92f9");
|
||||||
despawnEffect = Fx.none;
|
despawnEffect = Fx.none;
|
||||||
@@ -670,7 +671,7 @@ public class UnitTypes implements ContentList{
|
|||||||
bullet = new SapBulletType(){{
|
bullet = new SapBulletType(){{
|
||||||
sapStrength = 0.8f;
|
sapStrength = 0.8f;
|
||||||
length = 40f;
|
length = 40f;
|
||||||
damage = 15;
|
damage = 16;
|
||||||
shootEffect = Fx.shootSmall;
|
shootEffect = Fx.shootSmall;
|
||||||
hitColor = color = Color.valueOf("bf92f9");
|
hitColor = color = Color.valueOf("bf92f9");
|
||||||
despawnEffect = Fx.none;
|
despawnEffect = Fx.none;
|
||||||
@@ -975,7 +976,7 @@ public class UnitTypes implements ContentList{
|
|||||||
|
|
||||||
zenith = new UnitType("zenith"){{
|
zenith = new UnitType("zenith"){{
|
||||||
health = 700;
|
health = 700;
|
||||||
speed = 1.7f;
|
speed = 1.8f;
|
||||||
accel = 0.04f;
|
accel = 0.04f;
|
||||||
drag = 0.016f;
|
drag = 0.016f;
|
||||||
flying = true;
|
flying = true;
|
||||||
@@ -997,7 +998,7 @@ public class UnitTypes implements ContentList{
|
|||||||
velocityRnd = 0.2f;
|
velocityRnd = 0.2f;
|
||||||
shootSound = Sounds.missile;
|
shootSound = Sounds.missile;
|
||||||
|
|
||||||
bullet = new MissileBulletType(3f, 12){{
|
bullet = new MissileBulletType(3f, 14){{
|
||||||
width = 8f;
|
width = 8f;
|
||||||
height = 8f;
|
height = 8f;
|
||||||
shrinkY = 0f;
|
shrinkY = 0f;
|
||||||
@@ -1005,7 +1006,7 @@ public class UnitTypes implements ContentList{
|
|||||||
homingRange = 60f;
|
homingRange = 60f;
|
||||||
keepVelocity = false;
|
keepVelocity = false;
|
||||||
splashDamageRadius = 25f;
|
splashDamageRadius = 25f;
|
||||||
splashDamage = 10f;
|
splashDamage = 14f;
|
||||||
lifetime = 60f;
|
lifetime = 60f;
|
||||||
trailColor = Pal.unitBack;
|
trailColor = Pal.unitBack;
|
||||||
backColor = Pal.unitBack;
|
backColor = Pal.unitBack;
|
||||||
@@ -1251,8 +1252,8 @@ public class UnitTypes implements ContentList{
|
|||||||
|
|
||||||
mineTier = 3;
|
mineTier = 3;
|
||||||
mineSpeed = 4f;
|
mineSpeed = 4f;
|
||||||
health = 500;
|
health = 460;
|
||||||
armor = 5f;
|
armor = 3f;
|
||||||
speed = 2.5f;
|
speed = 2.5f;
|
||||||
accel = 0.06f;
|
accel = 0.06f;
|
||||||
drag = 0.017f;
|
drag = 0.017f;
|
||||||
@@ -1264,6 +1265,7 @@ public class UnitTypes implements ContentList{
|
|||||||
engineSize = 3f;
|
engineSize = 3f;
|
||||||
payloadCapacity = (2 * 2) * tilePayload;
|
payloadCapacity = (2 * 2) * tilePayload;
|
||||||
buildSpeed = 2.6f;
|
buildSpeed = 2.6f;
|
||||||
|
isCounted = false;
|
||||||
|
|
||||||
ammoType = AmmoTypes.power;
|
ammoType = AmmoTypes.power;
|
||||||
|
|
||||||
@@ -1274,7 +1276,13 @@ public class UnitTypes implements ContentList{
|
|||||||
x = 8f;
|
x = 8f;
|
||||||
y = -6f;
|
y = -6f;
|
||||||
rotate = true;
|
rotate = true;
|
||||||
bullet = Bullets.healBulletBig;
|
bullet = new LaserBoltBulletType(5.2f, 10){{
|
||||||
|
lifetime = 35f;
|
||||||
|
healPercent = 5.5f;
|
||||||
|
collidesTeam = true;
|
||||||
|
backColor = Pal.heal;
|
||||||
|
frontColor = Color.white;
|
||||||
|
}};
|
||||||
}},
|
}},
|
||||||
new Weapon("heal-weapon-mount"){{
|
new Weapon("heal-weapon-mount"){{
|
||||||
shootSound = Sounds.lasershoot;
|
shootSound = Sounds.lasershoot;
|
||||||
@@ -1282,7 +1290,13 @@ public class UnitTypes implements ContentList{
|
|||||||
x = 4f;
|
x = 4f;
|
||||||
y = 5f;
|
y = 5f;
|
||||||
rotate = true;
|
rotate = true;
|
||||||
bullet = Bullets.healBullet;
|
bullet = new LaserBoltBulletType(5.2f, 8){{
|
||||||
|
lifetime = 35f;
|
||||||
|
healPercent = 3f;
|
||||||
|
collidesTeam = true;
|
||||||
|
backColor = Pal.heal;
|
||||||
|
frontColor = Color.white;
|
||||||
|
}};
|
||||||
}});
|
}});
|
||||||
}};
|
}};
|
||||||
|
|
||||||
@@ -1349,7 +1363,7 @@ public class UnitTypes implements ContentList{
|
|||||||
collides = false;
|
collides = false;
|
||||||
|
|
||||||
healPercent = 15f;
|
healPercent = 15f;
|
||||||
splashDamage = 240f;
|
splashDamage = 230f;
|
||||||
splashDamageRadius = 120f;
|
splashDamageRadius = 120f;
|
||||||
}};
|
}};
|
||||||
}});
|
}});
|
||||||
|
|||||||
@@ -53,10 +53,11 @@ public class Weathers implements ContentList{
|
|||||||
baseSpeed = 5.4f;
|
baseSpeed = 5.4f;
|
||||||
attrs.set(Attribute.light, -0.1f);
|
attrs.set(Attribute.light, -0.1f);
|
||||||
attrs.set(Attribute.water, -0.1f);
|
attrs.set(Attribute.water, -0.1f);
|
||||||
opacityMultiplier = 0.5f;
|
opacityMultiplier = 0.35f;
|
||||||
force = 0.1f;
|
force = 0.1f;
|
||||||
sound = Sounds.wind;
|
sound = Sounds.wind;
|
||||||
soundVol = 0.3f;
|
soundVol = 0.8f;
|
||||||
|
duration = 7f * Time.toMinutes;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
sporestorm = new ParticleWeather("sporestorm"){{
|
sporestorm = new ParticleWeather("sporestorm"){{
|
||||||
@@ -77,7 +78,8 @@ public class Weathers implements ContentList{
|
|||||||
opacityMultiplier = 0.75f;
|
opacityMultiplier = 0.75f;
|
||||||
force = 0.1f;
|
force = 0.1f;
|
||||||
sound = Sounds.wind;
|
sound = Sounds.wind;
|
||||||
soundVol = 0.3f;
|
soundVol = 0.7f;
|
||||||
|
duration = 7f * Time.toMinutes;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
fog = new ParticleWeather("fog"){{
|
fog = new ParticleWeather("fog"){{
|
||||||
|
|||||||
@@ -334,10 +334,29 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
state.wave = 1;
|
state.wave = 1;
|
||||||
//set up default wave time
|
//set up default wave time
|
||||||
state.wavetime = state.rules.waveSpacing * 2f;
|
state.wavetime = state.rules.waveSpacing * 2f;
|
||||||
|
//reset captured state
|
||||||
|
sector.info.wasCaptured = false;
|
||||||
|
//re-enable waves
|
||||||
|
state.rules.waves = true;
|
||||||
|
|
||||||
//reset win wave??
|
//reset win wave??
|
||||||
state.rules.winWave = state.rules.attackMode ? -1 : sector.preset != null ? sector.preset.captureWave : 40;
|
state.rules.winWave = state.rules.attackMode ? -1 : sector.preset != null ? sector.preset.captureWave : 40;
|
||||||
|
|
||||||
|
//if there's still an enemy base left, fix it
|
||||||
|
if(state.rules.attackMode){
|
||||||
|
//replace all broken blocks
|
||||||
|
for(var plan : state.rules.waveTeam.data().blocks){
|
||||||
|
Tile tile = world.tile(plan.x, plan.y);
|
||||||
|
if(tile != null){
|
||||||
|
tile.setBlock(content.block(plan.block), state.rules.waveTeam, plan.rotation);
|
||||||
|
if(plan.config != null && tile.build != null){
|
||||||
|
tile.build.configure(plan.config);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
state.rules.waveTeam.data().blocks.clear();
|
||||||
|
}
|
||||||
|
|
||||||
//kill all units, since they should be dead anyway
|
//kill all units, since they should be dead anyway
|
||||||
Groups.unit.clear();
|
Groups.unit.clear();
|
||||||
Groups.fire.clear();
|
Groups.fire.clear();
|
||||||
|
|||||||
@@ -109,6 +109,13 @@ public class Logic implements ApplicationListener{
|
|||||||
}
|
}
|
||||||
state.rules.waveTeam.rules().aiTier = state.getSector().threat * 0.8f;
|
state.rules.waveTeam.rules().aiTier = state.getSector().threat * 0.8f;
|
||||||
state.rules.waveTeam.rules().infiniteResources = true;
|
state.rules.waveTeam.rules().infiniteResources = true;
|
||||||
|
|
||||||
|
//fill enemy cores by default.
|
||||||
|
for(var core : state.rules.waveTeam.cores()){
|
||||||
|
for(Item item : content.items()){
|
||||||
|
core.items.set(item, core.block.itemCapacity);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//save settings
|
//save settings
|
||||||
@@ -260,6 +267,8 @@ public class Logic implements ApplicationListener{
|
|||||||
|
|
||||||
if(state.rules.sector == null) return;
|
if(state.rules.sector == null) return;
|
||||||
|
|
||||||
|
state.rules.sector.info.wasCaptured = true;
|
||||||
|
|
||||||
//fire capture event
|
//fire capture event
|
||||||
Events.fire(new SectorCaptureEvent(state.rules.sector));
|
Events.fire(new SectorCaptureEvent(state.rules.sector));
|
||||||
|
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -447,6 +447,11 @@ public class NetServer implements ApplicationListener{
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(currentlyKicking[0].target.team() != player.team()){
|
||||||
|
player.sendMessage("[scarlet]You can't vote for other teams.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if(!arg[0].toLowerCase().equals("y") && !arg[0].toLowerCase().equals("n")){
|
if(!arg[0].toLowerCase().equals("y") && !arg[0].toLowerCase().equals("n")){
|
||||||
player.sendMessage("[scarlet]Vote either 'y' (yes) or 'n' (no).");
|
player.sendMessage("[scarlet]Vote either 'y' (yes) or 'n' (no).");
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -311,7 +311,7 @@ public class World{
|
|||||||
//TODO bad code
|
//TODO bad code
|
||||||
boolean hasSnow = floors[0].name.contains("ice") || floors[0].name.contains("snow");
|
boolean hasSnow = floors[0].name.contains("ice") || floors[0].name.contains("snow");
|
||||||
boolean hasRain = !hasSnow && content.contains(Liquids.water) && !floors[0].name.contains("sand");
|
boolean hasRain = !hasSnow && content.contains(Liquids.water) && !floors[0].name.contains("sand");
|
||||||
boolean hasDesert = !hasSnow && !hasRain && floors[0].name.contains("sand");
|
boolean hasDesert = !hasSnow && !hasRain && floors[0] == Blocks.sand;
|
||||||
boolean hasSpores = floors[0].name.contains("spore") || floors[0].name.contains("moss") || floors[0].name.contains("tainted");
|
boolean hasSpores = floors[0].name.contains("spore") || floors[0].name.contains("moss") || floors[0].name.contains("tainted");
|
||||||
|
|
||||||
if(hasSnow){
|
if(hasSnow){
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ import mindustry.ui.*;
|
|||||||
|
|
||||||
public class WaveGraph extends Table{
|
public class WaveGraph extends Table{
|
||||||
public Seq<SpawnGroup> groups = new Seq<>();
|
public Seq<SpawnGroup> groups = new Seq<>();
|
||||||
public int from, to = 20;
|
public int from = 0, to = 20;
|
||||||
|
|
||||||
private Mode mode = Mode.counts;
|
private Mode mode = Mode.counts;
|
||||||
private int[][] values;
|
private int[][] values;
|
||||||
@@ -114,7 +114,7 @@ public class WaveGraph extends Table{
|
|||||||
|
|
||||||
Lines.line(cx, cy, cx, cy + len);
|
Lines.line(cx, cy, cx, cy + len);
|
||||||
if(i == values.length/2){
|
if(i == values.length/2){
|
||||||
font.draw("" + (i + from), cx, cy - 2f, Align.center);
|
font.draw("" + (i + from + 1), cx, cy - 2f, Align.center);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
font.setColor(Color.white);
|
font.setColor(Color.white);
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package mindustry.entities;
|
|||||||
|
|
||||||
import arc.*;
|
import arc.*;
|
||||||
import arc.func.*;
|
import arc.func.*;
|
||||||
import arc.graphics.*;
|
|
||||||
import arc.math.*;
|
import arc.math.*;
|
||||||
import arc.math.geom.*;
|
import arc.math.geom.*;
|
||||||
import arc.struct.*;
|
import arc.struct.*;
|
||||||
@@ -33,23 +32,30 @@ public class Damage{
|
|||||||
private static Unit tmpUnit;
|
private static Unit tmpUnit;
|
||||||
|
|
||||||
/** Creates a dynamic explosion based on specified parameters. */
|
/** Creates a dynamic explosion based on specified parameters. */
|
||||||
public static void dynamicExplosion(float x, float y, float flammability, float explosiveness, float power, float radius, Color color, boolean damage){
|
public static void dynamicExplosion(float x, float y, float flammability, float explosiveness, float power, float radius, boolean damage){
|
||||||
|
dynamicExplosion(x, y, flammability, explosiveness, power, radius, damage, true, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Creates a dynamic explosion based on specified parameters. */
|
||||||
|
public static void dynamicExplosion(float x, float y, float flammability, float explosiveness, float power, float radius, boolean damage, boolean fire, @Nullable Team ignoreTeam){
|
||||||
if(damage){
|
if(damage){
|
||||||
for(int i = 0; i < Mathf.clamp(power / 20, 0, 6); i++){
|
for(int i = 0; i < Mathf.clamp(power / 20, 0, 6); i++){
|
||||||
int branches = 5 + Mathf.clamp((int)(power / 30), 1, 20);
|
int branches = 5 + Mathf.clamp((int)(power / 30), 1, 20);
|
||||||
Time.run(i * 2f + Mathf.random(4f), () -> Lightning.create(Team.derelict, Pal.power, 3, x, y, Mathf.random(360f), branches + Mathf.range(2)));
|
Time.run(i * 2f + Mathf.random(4f), () -> Lightning.create(Team.derelict, Pal.power, 3, x, y, Mathf.random(360f), branches + Mathf.range(2)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(fire){
|
||||||
for(int i = 0; i < Mathf.clamp(flammability / 4, 0, 30); i++){
|
for(int i = 0; i < Mathf.clamp(flammability / 4, 0, 30); i++){
|
||||||
Time.run(i / 2f, () -> Call.createBullet(Bullets.fireball, Team.derelict, x, y, Mathf.random(360f), Bullets.fireball.damage, 1, 1));
|
Time.run(i / 2f, () -> Call.createBullet(Bullets.fireball, Team.derelict, x, y, Mathf.random(360f), Bullets.fireball.damage, 1, 1));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int waves = Mathf.clamp((int)(explosiveness / 4), 0, 30);
|
int waves = Mathf.clamp((int)(explosiveness / 4), 0, 30);
|
||||||
|
|
||||||
for(int i = 0; i < waves; i++){
|
for(int i = 0; i < waves; i++){
|
||||||
int f = i;
|
int f = i;
|
||||||
Time.run(i * 2f, () -> {
|
Time.run(i * 2f, () -> {
|
||||||
Damage.damage(x, y, Mathf.clamp(radius + explosiveness, 0, 50f) * ((f + 1f) / waves), explosiveness / 2f);
|
Damage.damage(ignoreTeam, x, y, Mathf.clamp(radius + explosiveness, 0, 50f) * ((f + 1f) / waves), explosiveness / 2f, false);
|
||||||
Fx.blockExplosionSmoke.at(x + Mathf.range(radius), y + Mathf.range(radius));
|
Fx.blockExplosionSmoke.at(x + Mathf.range(radius), y + Mathf.range(radius));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -435,7 +435,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Handle a stack input. */
|
/** Handle a stack input. */
|
||||||
public void handleStack(Item item, int amount, Teamc source){
|
public void handleStack(Item item, int amount, @Nullable Teamc source){
|
||||||
noSleep();
|
noSleep();
|
||||||
items.add(item, amount);
|
items.add(item, amount);
|
||||||
}
|
}
|
||||||
@@ -519,6 +519,8 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
|||||||
public void dumpLiquid(Liquid liquid){
|
public void dumpLiquid(Liquid liquid){
|
||||||
int dump = this.cdump;
|
int dump = this.cdump;
|
||||||
|
|
||||||
|
if(liquids.get(liquid) <= 0.0001f) return;
|
||||||
|
|
||||||
if(!net.client() && state.isCampaign() && team == state.rules.defaultTeam) liquid.unlock();
|
if(!net.client() && state.isCampaign() && team == state.rules.defaultTeam) liquid.unlock();
|
||||||
|
|
||||||
for(int i = 0; i < proximity.size; i++){
|
for(int i = 0; i < proximity.size; i++){
|
||||||
@@ -970,34 +972,13 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Damage.dynamicExplosion(x, y, flammability, explosiveness * 3.5f, power, tilesize * block.size / 2f, Pal.darkFlame, state.rules.damageExplosions);
|
Damage.dynamicExplosion(x, y, flammability, explosiveness * 3.5f, power, tilesize * block.size / 2f, state.rules.damageExplosions);
|
||||||
|
|
||||||
if(!floor().solid && !floor().isLiquid){
|
if(!floor().solid && !floor().isLiquid){
|
||||||
Effect.rubble(x, y, block.size);
|
Effect.rubble(x, y, block.size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the flammability of the Used for fire calculations.
|
|
||||||
* Takes flammability of floor liquid into account.
|
|
||||||
*/
|
|
||||||
public float getFlammability(){
|
|
||||||
if(!block.hasItems){
|
|
||||||
if(floor().isLiquid && !block.solid){
|
|
||||||
return floor().liquidDrop.flammability;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}else{
|
|
||||||
float result = items.sum((item, amount) -> item.flammability * amount);
|
|
||||||
|
|
||||||
if(block.hasLiquids){
|
|
||||||
result += liquids.sum((liquid, amount) -> liquid.flammability * amount / 3f);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getDisplayName(){
|
public String getDisplayName(){
|
||||||
return block.localizedName;
|
return block.localizedName;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ abstract class FireComp implements Timedc, Posc, Firec, Syncc{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(){
|
public void update(){
|
||||||
if(Mathf.chance(0.1 * Time.delta)){
|
if(Mathf.chance(0.09 * Time.delta)){
|
||||||
Fx.fire.at(x + Mathf.range(4f), y + Mathf.range(4f));
|
Fx.fire.at(x + Mathf.range(4f), y + Mathf.range(4f));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,7 +59,7 @@ abstract class FireComp implements Timedc, Posc, Firec, Syncc{
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(baseFlammability < 0 || block != tile.block()){
|
if(baseFlammability < 0 || block != tile.block()){
|
||||||
baseFlammability = tile.build == null ? 0 : tile.build.getFlammability();
|
baseFlammability = tile.build == null ? 0 : tile.getFlammability();
|
||||||
block = tile.block();
|
block = tile.block();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,12 +77,12 @@ abstract class FireComp implements Timedc, Posc, Firec, Syncc{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(Mathf.chance(0.1 * Time.delta)){
|
if(Mathf.chance(0.025 * Time.delta)){
|
||||||
Puddlec p = Puddles.get(tile);
|
Puddlec p = Puddles.get(tile);
|
||||||
puddleFlammability = p != null ? p.getFlammability() / 3f : 0;
|
puddleFlammability = p != null ? p.getFlammability() / 3f : 0;
|
||||||
|
|
||||||
if(damage){
|
if(damage){
|
||||||
entity.damage(0.4f);
|
entity.damage(1.6f);
|
||||||
}
|
}
|
||||||
Damage.damageUnits(null, tile.worldx(), tile.worldy(), tilesize, 3f,
|
Damage.damageUnits(null, tile.worldx(), tile.worldy(), tilesize, 3f,
|
||||||
unit -> !unit.isFlying() && !unit.isImmune(StatusEffects.burning),
|
unit -> !unit.isFlying() && !unit.isImmune(StatusEffects.burning),
|
||||||
|
|||||||
@@ -46,8 +46,8 @@ abstract class FlyingComp implements Posc, Velc, Healthc, Hitboxc{
|
|||||||
}
|
}
|
||||||
|
|
||||||
void wobble(){
|
void wobble(){
|
||||||
x += Mathf.sin(Time.time() + id() * 99, 25f, 0.05f) * Time.delta * elevation;
|
x += Mathf.sin(Time.time() + (id() % 10) * 12, 25f, 0.05f) * Time.delta * elevation;
|
||||||
y += Mathf.cos(Time.time() + id() * 99, 25f, 0.05f) * Time.delta * elevation;
|
y += Mathf.cos(Time.time() + (id() % 10) * 12, 25f, 0.05f) * Time.delta * elevation;
|
||||||
}
|
}
|
||||||
|
|
||||||
void moveAt(Vec2 vector, float acceleration){
|
void moveAt(Vec2 vector, float acceleration){
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ abstract class MinerComp implements Itemsc, Posc, Teamc, Rotc, Drawc{
|
|||||||
if(core != null && mineTile != null && mineTile.drop() != null && !acceptsItem(mineTile.drop()) && within(core, mineTransferRange) && !offloadImmediately()){
|
if(core != null && mineTile != null && mineTile.drop() != null && !acceptsItem(mineTile.drop()) && within(core, mineTransferRange) && !offloadImmediately()){
|
||||||
int accepted = core.acceptStack(item(), stack().amount, this);
|
int accepted = core.acceptStack(item(), stack().amount, this);
|
||||||
if(accepted > 0){
|
if(accepted > 0){
|
||||||
Call.transferItemTo(item(), accepted,
|
Call.transferItemTo(self(), item(), accepted,
|
||||||
mineTile.worldx() + Mathf.range(tilesize / 2f),
|
mineTile.worldx() + Mathf.range(tilesize / 2f),
|
||||||
mineTile.worldy() + Mathf.range(tilesize / 2f), core);
|
mineTile.worldy() + Mathf.range(tilesize / 2f), core);
|
||||||
clearItem();
|
clearItem();
|
||||||
@@ -77,7 +77,7 @@ abstract class MinerComp implements Itemsc, Posc, Teamc, Rotc, Drawc{
|
|||||||
mineTimer = 0;
|
mineTimer = 0;
|
||||||
|
|
||||||
if(core != null && within(core, mineTransferRange) && core.acceptStack(item, 1, this) == 1 && offloadImmediately()){
|
if(core != null && within(core, mineTransferRange) && core.acceptStack(item, 1, this) == 1 && offloadImmediately()){
|
||||||
Call.transferItemTo(item, 1,
|
Call.transferItemTo(self(), item, 1,
|
||||||
mineTile.worldx() + Mathf.range(tilesize / 2f),
|
mineTile.worldx() + Mathf.range(tilesize / 2f),
|
||||||
mineTile.worldy() + Mathf.range(tilesize / 2f), core);
|
mineTile.worldy() + Mathf.range(tilesize / 2f), core);
|
||||||
}else if(acceptsItem(item)){
|
}else if(acceptsItem(item)){
|
||||||
|
|||||||
@@ -397,9 +397,12 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
|
|||||||
|
|
||||||
/** Actually destroys the unit, removing it and creating explosions. **/
|
/** Actually destroys the unit, removing it and creating explosions. **/
|
||||||
public void destroy(){
|
public void destroy(){
|
||||||
float explosiveness = 2f + item().explosiveness * stack().amount / 2.4f;
|
float explosiveness = 2f + item().explosiveness * stack().amount * 1.53f;
|
||||||
float flammability = item().flammability * stack().amount / 2.4f;
|
float flammability = item().flammability * stack().amount / 1.9f;
|
||||||
Damage.dynamicExplosion(x, y, flammability, explosiveness, 0f, bounds() / 2f, Pal.darkFlame, state.rules.damageExplosions);
|
|
||||||
|
if(!spawnedByCore){
|
||||||
|
Damage.dynamicExplosion(x, y, flammability, explosiveness, 0f, bounds() / 2f, state.rules.damageExplosions, item().flammability > 1, team);
|
||||||
|
}
|
||||||
|
|
||||||
float shake = hitSize / 3f;
|
float shake = hitSize / 3f;
|
||||||
|
|
||||||
@@ -415,7 +418,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
|
|||||||
}
|
}
|
||||||
|
|
||||||
//if this unit crash landed (was flying), damage stuff in a radius
|
//if this unit crash landed (was flying), damage stuff in a radius
|
||||||
if(type.flying){
|
if(type.flying && !spawnedByCore){
|
||||||
Damage.damage(team,x, y, Mathf.pow(hitSize, 0.94f) * 1.25f, Mathf.pow(hitSize, 0.75f) * type.crashDamageMultiplier * 5f, true, false, true);
|
Damage.damage(team,x, y, Mathf.pow(hitSize, 0.94f) * 1.25f, Mathf.pow(hitSize, 0.75f) * type.crashDamageMultiplier * 5f, true, false, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ public class EventType{
|
|||||||
impactPower,
|
impactPower,
|
||||||
thoriumReactorOverheat,
|
thoriumReactorOverheat,
|
||||||
fireExtinguish,
|
fireExtinguish,
|
||||||
|
acceleratorUse,
|
||||||
newGame,
|
newGame,
|
||||||
tutorialComplete,
|
tutorialComplete,
|
||||||
flameAmmo,
|
flameAmmo,
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ public class Objectives{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean complete(){
|
public boolean complete(){
|
||||||
return preset.sector.save != null && !preset.sector.isAttacked() && preset.sector.hasBase();
|
return preset.sector.save != null && (!preset.sector.isAttacked() || preset.sector.info.wasCaptured) && preset.sector.hasBase();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -33,6 +33,8 @@ public class SectorInfo{
|
|||||||
public int storageCapacity = 0;
|
public int storageCapacity = 0;
|
||||||
/** Whether a core is available here. */
|
/** Whether a core is available here. */
|
||||||
public boolean hasCore = true;
|
public boolean hasCore = true;
|
||||||
|
/** Whether this sector was ever fully captured. */
|
||||||
|
public boolean wasCaptured = false;
|
||||||
/** Sector that was launched from. */
|
/** Sector that was launched from. */
|
||||||
public @Nullable Sector origin;
|
public @Nullable Sector origin;
|
||||||
/** Launch destination. */
|
/** Launch destination. */
|
||||||
@@ -69,7 +71,9 @@ public class SectorInfo{
|
|||||||
public boolean shown = false;
|
public boolean shown = false;
|
||||||
|
|
||||||
/** Special variables for simulation. */
|
/** Special variables for simulation. */
|
||||||
public float sumHealth, sumRps, sumDps, waveHealthBase, waveHealthSlope, waveDpsBase, waveDpsSlope;
|
public float sumHealth, sumRps, sumDps, waveHealthBase, waveHealthSlope, waveDpsBase, waveDpsSlope, bossHealth, bossDps;
|
||||||
|
/** Wave where first boss shows up. */
|
||||||
|
public int bossWave = -1;
|
||||||
|
|
||||||
/** Counter refresh state. */
|
/** Counter refresh state. */
|
||||||
private transient Interval time = new Interval();
|
private transient Interval time = new Interval();
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import arc.struct.*;
|
|||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
import mindustry.content.*;
|
import mindustry.content.*;
|
||||||
import mindustry.game.EventType.*;
|
import mindustry.game.EventType.*;
|
||||||
import mindustry.io.legacy.*;
|
import mindustry.game.SectorInfo.*;
|
||||||
import mindustry.maps.*;
|
import mindustry.maps.*;
|
||||||
import mindustry.type.*;
|
import mindustry.type.*;
|
||||||
import mindustry.world.blocks.storage.*;
|
import mindustry.world.blocks.storage.*;
|
||||||
@@ -27,13 +27,6 @@ public class Universe{
|
|||||||
public Universe(){
|
public Universe(){
|
||||||
load();
|
load();
|
||||||
|
|
||||||
//load legacy research
|
|
||||||
Events.on(ClientLoadEvent.class, e -> {
|
|
||||||
if(Core.settings.has("unlocks")){
|
|
||||||
LegacyIO.readResearch();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
//update base coverage on capture
|
//update base coverage on capture
|
||||||
Events.on(SectorCaptureEvent.class, e -> {
|
Events.on(SectorCaptureEvent.class, e -> {
|
||||||
if(!net.client() && state.isCampaign()){
|
if(!net.client() && state.isCampaign()){
|
||||||
@@ -188,6 +181,7 @@ public class Universe{
|
|||||||
}else if(attacked && wavesPassed > 0 && sector.info.winWave > 1 && sector.info.wave + wavesPassed >= sector.info.winWave && !sector.hasEnemyBase()){
|
}else if(attacked && wavesPassed > 0 && sector.info.winWave > 1 && sector.info.wave + wavesPassed >= sector.info.winWave && !sector.hasEnemyBase()){
|
||||||
//autocapture the sector
|
//autocapture the sector
|
||||||
sector.info.waves = false;
|
sector.info.waves = false;
|
||||||
|
sector.info.wasCaptured = true;
|
||||||
|
|
||||||
//fire the event
|
//fire the event
|
||||||
Events.fire(new SectorCaptureEvent(sector));
|
Events.fire(new SectorCaptureEvent(sector));
|
||||||
@@ -206,6 +200,13 @@ public class Universe{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sector.info.export.each((item, amount) -> {
|
||||||
|
if(sector.info.items.get(item) <= 0 && sector.info.production.get(item, ExportStat::new).mean <= 0){
|
||||||
|
//disable export when production is negative.
|
||||||
|
sector.info.export.get(item).mean = 0f;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
//add production, making sure that it's capped
|
//add production, making sure that it's capped
|
||||||
sector.info.production.each((item, stat) -> sector.info.items.add(item, Math.min((int)(stat.mean * newSecondsPassed * scl), sector.info.storageCapacity - sector.info.items.get(item))));
|
sector.info.production.each((item, stat) -> sector.info.items.add(item, Math.min((int)(stat.mean * newSecondsPassed * scl), sector.info.storageCapacity - sector.info.items.get(item))));
|
||||||
//prevent negative values with unloaders
|
//prevent negative values with unloaders
|
||||||
|
|||||||
@@ -96,18 +96,17 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Remote(called = Loc.server, unreliable = true)
|
@Remote(called = Loc.server, unreliable = true)
|
||||||
public static void transferItemTo(Item item, int amount, float x, float y, Building build){
|
public static void setItem(Building build, Item item, int amount){
|
||||||
if(build == null || build.items == null) return;
|
if(build == null || build.items == null) return;
|
||||||
for(int i = 0; i < Mathf.clamp(amount / 5, 1, 8); i++){
|
build.items.set(item, amount);
|
||||||
Time.run(i * 3, () -> createItemTransfer(item, amount, x, y, build, () -> {}));
|
|
||||||
}
|
|
||||||
build.items.add(item, amount);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Remote(called = Loc.server, unreliable = true)
|
@Remote(called = Loc.server, unreliable = true)
|
||||||
public static void transferItemTo(Unit unit, Item item, int amount, float x, float y, Building build){
|
public static void transferItemTo(@Nullable Unit unit, Item item, int amount, float x, float y, Building build){
|
||||||
if(build == null || build.items == null) return;
|
if(build == null || build.items == null) return;
|
||||||
unit.stack.amount = Math.max(unit.stack.amount - amount, 0);
|
|
||||||
|
if(unit != null) unit.stack.amount = Math.max(unit.stack.amount - amount, 0);
|
||||||
|
|
||||||
for(int i = 0; i < Mathf.clamp(amount / 3, 1, 8); i++){
|
for(int i = 0; i < Mathf.clamp(amount / 3, 1, 8); i++){
|
||||||
Time.run(i * 3, () -> createItemTransfer(item, amount, x, y, build, () -> {}));
|
Time.run(i * 3, () -> createItemTransfer(item, amount, x, y, build, () -> {}));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,6 +68,11 @@ public class SectorDamage{
|
|||||||
float enemyDps = info.waveDpsBase + info.waveDpsSlope * (i);
|
float enemyDps = info.waveDpsBase + info.waveDpsSlope * (i);
|
||||||
float enemyHealth = info.waveHealthBase + info.waveHealthSlope * (i);
|
float enemyHealth = info.waveHealthBase + info.waveHealthSlope * (i);
|
||||||
|
|
||||||
|
if(info.bossWave == i){
|
||||||
|
enemyDps += info.bossDps;
|
||||||
|
enemyHealth += info.bossHealth;
|
||||||
|
}
|
||||||
|
|
||||||
//happens due to certain regressions
|
//happens due to certain regressions
|
||||||
if(enemyHealth < 0 || enemyDps < 0) continue;
|
if(enemyHealth < 0 || enemyDps < 0) continue;
|
||||||
|
|
||||||
@@ -305,6 +310,7 @@ public class SectorDamage{
|
|||||||
|
|
||||||
//calculate DPS and health for the next few waves and store in list
|
//calculate DPS and health for the next few waves and store in list
|
||||||
var reg = new LinearRegression();
|
var reg = new LinearRegression();
|
||||||
|
SpawnGroup bossGroup = null;
|
||||||
Seq<Vec2> waveDps = new Seq<>(), waveHealth = new Seq<>();
|
Seq<Vec2> waveDps = new Seq<>(), waveHealth = new Seq<>();
|
||||||
|
|
||||||
for(int wave = state.wave; wave < state.wave + 10; wave ++){
|
for(int wave = state.wave; wave < state.wave + 10; wave ++){
|
||||||
@@ -320,6 +326,11 @@ public class SectorDamage{
|
|||||||
float healthMult = 1f + Mathf.clamp(group.type.armor / 20f);
|
float healthMult = 1f + Mathf.clamp(group.type.armor / 20f);
|
||||||
StatusEffect effect = (group.effect == null ? StatusEffects.none : group.effect);
|
StatusEffect effect = (group.effect == null ? StatusEffects.none : group.effect);
|
||||||
int spawned = group.getSpawned(wave);
|
int spawned = group.getSpawned(wave);
|
||||||
|
//save the boss group
|
||||||
|
if(group.effect == StatusEffects.boss){
|
||||||
|
bossGroup = group;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if(spawned <= 0) continue;
|
if(spawned <= 0) continue;
|
||||||
sumWaveHealth += spawned * (group.getShield(wave) + group.type.health * effect.healthMultiplier * healthMult);
|
sumWaveHealth += spawned * (group.getShield(wave) + group.type.health * effect.healthMultiplier * healthMult);
|
||||||
sumWaveDps += spawned * group.type.dpsEstimate * effect.damageMultiplier;
|
sumWaveDps += spawned * group.type.dpsEstimate * effect.damageMultiplier;
|
||||||
@@ -328,6 +339,21 @@ public class SectorDamage{
|
|||||||
waveHealth.add(new Vec2(wave, sumWaveHealth));
|
waveHealth.add(new Vec2(wave, sumWaveHealth));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(bossGroup != null){
|
||||||
|
float bossMult = 1.1f;
|
||||||
|
//calculate first boss appearaance
|
||||||
|
for(int wave = state.wave; wave < state.wave + 60; wave++){
|
||||||
|
int spawned = bossGroup.getSpawned(wave - 1);
|
||||||
|
if(spawned > 0){
|
||||||
|
//set up relevant stats
|
||||||
|
info.bossWave = wave;
|
||||||
|
info.bossDps = spawned * bossGroup.type.dpsEstimate * StatusEffects.boss.damageMultiplier * bossMult;
|
||||||
|
info.bossHealth = spawned * (bossGroup.getShield(wave) + bossGroup.type.health * StatusEffects.boss.healthMultiplier * (1f + Mathf.clamp(bossGroup.type.armor / 20f))) * bossMult;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//calculate linear regression of the wave data and store it
|
//calculate linear regression of the wave data and store it
|
||||||
reg.calculate(waveHealth);
|
reg.calculate(waveHealth);
|
||||||
info.waveHealthBase = reg.intercept;
|
info.waveHealthBase = reg.intercept;
|
||||||
@@ -338,9 +364,9 @@ public class SectorDamage{
|
|||||||
info.waveDpsSlope = reg.slope;
|
info.waveDpsSlope = reg.slope;
|
||||||
|
|
||||||
//enemy units like to aim for a lot of non-essential things, so increase resulting health slightly
|
//enemy units like to aim for a lot of non-essential things, so increase resulting health slightly
|
||||||
info.sumHealth = sumHealth * 1.2f;
|
info.sumHealth = sumHealth * 1.05f;
|
||||||
//players tend to have longer range units/turrets, so assume DPS is higher
|
//players tend to have longer range units/turrets, so assume DPS is higher
|
||||||
info.sumDps = sumDps * 1.2f;
|
info.sumDps = sumDps * 1.05f;
|
||||||
info.sumRps = sumRps;
|
info.sumRps = sumRps;
|
||||||
|
|
||||||
info.wavesSurvived = getWavesSurvived(info);
|
info.wavesSurvived = getWavesSurvived(info);
|
||||||
@@ -356,7 +382,7 @@ public class SectorDamage{
|
|||||||
for(Tile tile : tiles){
|
for(Tile tile : tiles){
|
||||||
if((tile.block() instanceof CoreBlock && tile.team() == state.rules.waveTeam) || tile.overlay() == Blocks.spawn){
|
if((tile.block() instanceof CoreBlock && tile.team() == state.rules.waveTeam) || tile.overlay() == Blocks.spawn){
|
||||||
frontier.add(tile);
|
frontier.add(tile);
|
||||||
values[tile.x][tile.y] = fraction * 26;
|
values[tile.x][tile.y] = fraction * 24;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ package mindustry.maps.planet;
|
|||||||
import arc.graphics.*;
|
import arc.graphics.*;
|
||||||
import arc.math.*;
|
import arc.math.*;
|
||||||
import arc.math.geom.*;
|
import arc.math.geom.*;
|
||||||
|
import mindustry.content.*;
|
||||||
|
import mindustry.game.*;
|
||||||
import mindustry.maps.generators.*;
|
import mindustry.maps.generators.*;
|
||||||
|
|
||||||
public class TantrosPlanetGenerator extends PlanetGenerator{
|
public class TantrosPlanetGenerator extends PlanetGenerator{
|
||||||
@@ -18,4 +20,13 @@ public class TantrosPlanetGenerator extends PlanetGenerator{
|
|||||||
float depth = (float)noise.octaveNoise3D(2, 0.56, 1.7f, position.x, position.y, position.z) / 2f;
|
float depth = (float)noise.octaveNoise3D(2, 0.56, 1.7f, position.x, position.y, position.z) / 2f;
|
||||||
return c1.write(out).lerp(c2, Mathf.clamp(Mathf.round(depth, 0.15f))).a(0.6f);
|
return c1.write(out).lerp(c2, Mathf.clamp(Mathf.round(depth, 0.15f))).a(0.6f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void generate(){
|
||||||
|
pass((x, y) -> {
|
||||||
|
floor = Blocks.deepwater;
|
||||||
|
});
|
||||||
|
|
||||||
|
Schematics.placeLaunchLoadout(width / 2, height / 2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -225,7 +225,7 @@ public class ContentParser{
|
|||||||
currentContent = block;
|
currentContent = block;
|
||||||
|
|
||||||
read(() -> {
|
read(() -> {
|
||||||
if(value.has("consumes")){
|
if(value.has("consumes") && value.get("consumes").isObject()){
|
||||||
for(JsonValue child : value.get("consumes")){
|
for(JsonValue child : value.get("consumes")){
|
||||||
if(child.name.equals("item")){
|
if(child.name.equals("item")){
|
||||||
block.consumes.item(find(ContentType.item, child.asString()));
|
block.consumes.item(find(ContentType.item, child.asString()));
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ import static mindustry.Vars.*;
|
|||||||
|
|
||||||
public abstract class Weather extends UnlockableContent{
|
public abstract class Weather extends UnlockableContent{
|
||||||
/** Default duration of this weather event in ticks. */
|
/** Default duration of this weather event in ticks. */
|
||||||
public float duration = 9f * Time.toMinutes;
|
public float duration = 10f * Time.toMinutes;
|
||||||
public float opacityMultiplier = 1f;
|
public float opacityMultiplier = 1f;
|
||||||
public Attributes attrs = new Attributes();
|
public Attributes attrs = new Attributes();
|
||||||
public Sound sound = Sounds.none;
|
public Sound sound = Sounds.none;
|
||||||
@@ -262,7 +262,7 @@ public abstract class Weather extends UnlockableContent{
|
|||||||
|
|
||||||
/** Creates a weather entry with some approximate weather values. */
|
/** Creates a weather entry with some approximate weather values. */
|
||||||
public WeatherEntry(Weather weather){
|
public WeatherEntry(Weather weather){
|
||||||
this(weather, weather.duration * 3f, weather.duration * 6f, weather.duration / 2f, weather.duration * 1.5f);
|
this(weather, weather.duration * 2f, weather.duration * 6f, weather.duration / 2f, weather.duration * 1.5f);
|
||||||
}
|
}
|
||||||
|
|
||||||
public WeatherEntry(Weather weather, float minFrequency, float maxFrequency, float minDuration, float maxDuration){
|
public WeatherEntry(Weather weather, float minFrequency, float maxFrequency, float minDuration, float maxDuration){
|
||||||
|
|||||||
@@ -78,6 +78,9 @@ public class Bar extends Element{
|
|||||||
lastValue = computed;
|
lastValue = computed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(Float.isNaN(computed)) computed = 0;
|
||||||
|
if(Float.isInfinite(computed)) computed = 1f;
|
||||||
|
|
||||||
blink = Mathf.lerpDelta(blink, 0f, 0.2f);
|
blink = Mathf.lerpDelta(blink, 0f, 0.2f);
|
||||||
value = Mathf.lerpDelta(value, computed, 0.15f);
|
value = Mathf.lerpDelta(value, computed, 0.15f);
|
||||||
|
|
||||||
|
|||||||
@@ -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[]" +
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import mindustry.gen.*;
|
|||||||
import mindustry.graphics.*;
|
import mindustry.graphics.*;
|
||||||
import mindustry.graphics.g3d.*;
|
import mindustry.graphics.g3d.*;
|
||||||
import mindustry.input.*;
|
import mindustry.input.*;
|
||||||
|
import mindustry.io.legacy.*;
|
||||||
import mindustry.maps.*;
|
import mindustry.maps.*;
|
||||||
import mindustry.type.*;
|
import mindustry.type.*;
|
||||||
import mindustry.ui.*;
|
import mindustry.ui.*;
|
||||||
@@ -140,6 +141,13 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//load legacy research
|
||||||
|
if(Core.settings.has("unlocks") && !Core.settings.has("junction-unlocked")){
|
||||||
|
Core.app.post(() -> {
|
||||||
|
ui.showCustomConfirm("@research", "@research.legacy", "@research.load", "@research.discard", LegacyIO::readResearch, () -> Core.settings.remove("unlocks"));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
rebuildButtons();
|
rebuildButtons();
|
||||||
mode = look;
|
mode = look;
|
||||||
selected = hovered = launchSector = null;
|
selected = hovered = launchSector = null;
|
||||||
@@ -554,7 +562,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
|
|||||||
|
|
||||||
if(t.getChildren().any()){
|
if(t.getChildren().any()){
|
||||||
c.add(name).left().row();
|
c.add(name).left().row();
|
||||||
c.add(t).padLeft(10f).row();
|
c.add(t).padLeft(10f).left().row();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -103,6 +103,28 @@ public class Tile implements Position, QuadTreeObject, Displayable{
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the flammability of the Used for fire calculations.
|
||||||
|
* Takes flammability of floor liquid into account.
|
||||||
|
*/
|
||||||
|
public float getFlammability(){
|
||||||
|
if(!block.hasItems){
|
||||||
|
if(floor.liquidDrop != null && !block.solid){
|
||||||
|
return floor.liquidDrop.flammability;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}else if(build != null){
|
||||||
|
float result = build.items.sum((item, amount) -> item.flammability * amount);
|
||||||
|
|
||||||
|
if(block.hasLiquids){
|
||||||
|
result += build.liquids.sum((liquid, amount) -> liquid.flammability * amount / 3f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/** Convenience method that returns the building of this tile with a cast.
|
/** Convenience method that returns the building of this tile with a cast.
|
||||||
* Method name is shortened to prevent conflict. */
|
* Method name is shortened to prevent conflict. */
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -56,6 +56,11 @@ public class LaunchPad extends Block{
|
|||||||
bars.add("items", entity -> new Bar(() -> Core.bundle.format("bar.items", entity.items.total()), () -> Pal.items, () -> (float)entity.items.total() / itemCapacity));
|
bars.add("items", entity -> new Bar(() -> Core.bundle.format("bar.items", entity.items.total()), () -> Pal.items, () -> (float)entity.items.total() / itemCapacity));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean outputsItems(){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public class LaunchPadBuild extends Building{
|
public class LaunchPadBuild extends Building{
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -54,6 +54,7 @@ public class LaserTurret extends PowerTurret{
|
|||||||
super.updateTile();
|
super.updateTile();
|
||||||
|
|
||||||
if(bulletLife > 0 && bullet != null){
|
if(bulletLife > 0 && bullet != null){
|
||||||
|
wasShooting = true;
|
||||||
tr.trns(rotation, size * tilesize / 2f, 0f);
|
tr.trns(rotation, size * tilesize / 2f, 0f);
|
||||||
bullet.rotation(rotation);
|
bullet.rotation(rotation);
|
||||||
bullet.set(x + tr.x, y + tr.y);
|
bullet.set(x + tr.x, y + tr.y);
|
||||||
@@ -65,6 +66,7 @@ public class LaserTurret extends PowerTurret{
|
|||||||
bullet = null;
|
bullet = null;
|
||||||
}
|
}
|
||||||
}else if(reload > 0){
|
}else if(reload > 0){
|
||||||
|
wasShooting = true;
|
||||||
Liquid liquid = liquids.current();
|
Liquid liquid = liquids.current();
|
||||||
float maxUsed = consumes.<ConsumeLiquidBase>get(ConsumeType.liquid).amount;
|
float maxUsed = consumes.<ConsumeLiquidBase>get(ConsumeType.liquid).amount;
|
||||||
|
|
||||||
@@ -76,7 +78,6 @@ public class LaserTurret extends PowerTurret{
|
|||||||
coolEffect.at(x + Mathf.range(size * tilesize / 2f), y + Mathf.range(size * tilesize / 2f));
|
coolEffect.at(x + Mathf.range(size * tilesize / 2f), y + Mathf.range(size * tilesize / 2f));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -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(){
|
||||||
@@ -196,7 +205,7 @@ public abstract class Turret extends ReloadTurret{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean isActive(){
|
public boolean isActive(){
|
||||||
return target != null || (logicControlled() && logicShooting) || (isControlled() && unit.isShooting());
|
return target != null || wasShooting;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void targetPosition(Posc pos){
|
public void targetPosition(Posc pos){
|
||||||
@@ -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){
|
||||||
|
|
||||||
|
//when charging is enabled, use the charge shoot pattern
|
||||||
|
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;
|
recoil = recoilAmount;
|
||||||
heat = 1f;
|
heat = 1f;
|
||||||
|
bullet(type, rotation + Mathf.range(inaccuracy));
|
||||||
|
effects();
|
||||||
|
charging = false;
|
||||||
|
});
|
||||||
|
|
||||||
//when burst spacing is enabled, use the burst pattern
|
//when burst spacing is enabled, use the burst pattern
|
||||||
if(burstSpacing > 0.0001f){
|
}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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -311,7 +311,7 @@ public class Conveyor extends Block implements Autotiler{
|
|||||||
if(len >= capacity) return false;
|
if(len >= capacity) return false;
|
||||||
Tile facing = Edges.getFacingEdge(source.tile, tile);
|
Tile facing = Edges.getFacingEdge(source.tile, tile);
|
||||||
int direction = Math.abs(facing.relativeTo(tile.x, tile.y) - rotation);
|
int direction = Math.abs(facing.relativeTo(tile.x, tile.y) - rotation);
|
||||||
return (((direction == 0) && minitem >= itemSpace) || ((direction % 2 == 1) && minitem > 0.7f)) && !(source.block.rotate && (source.rotation + 2) % 4 == rotation);
|
return (((direction == 0) && minitem >= itemSpace) || ((direction % 2 == 1) && minitem > 0.7f)) && !(source.block.rotate && next == source);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ public class ItemBridge extends Block{
|
|||||||
Draw.reset();
|
Draw.reset();
|
||||||
Draw.color(Pal.placing);
|
Draw.color(Pal.placing);
|
||||||
Lines.stroke(1f);
|
Lines.stroke(1f);
|
||||||
if(link != null){
|
if(link != null && Math.abs(link.x - x) + Math.abs(link.y - y) > 1){
|
||||||
int rot = link.absoluteRelativeTo(x, y);
|
int rot = link.absoluteRelativeTo(x, y);
|
||||||
float w = (link.x == x ? tilesize : Math.abs(link.x - x) * tilesize - tilesize);
|
float w = (link.x == x ? tilesize : Math.abs(link.x - x) * tilesize - tilesize);
|
||||||
float h = (link.y == y ? tilesize : Math.abs(link.y - y) * tilesize - tilesize);
|
float h = (link.y == y ? tilesize : Math.abs(link.y - y) * tilesize - tilesize);
|
||||||
@@ -145,7 +145,7 @@ public class ItemBridge extends Block{
|
|||||||
if(config != null) return;
|
if(config != null) return;
|
||||||
|
|
||||||
Tile link = findLink(tile.x, tile.y);
|
Tile link = findLink(tile.x, tile.y);
|
||||||
if(linkValid(tile, link)){
|
if(linkValid(tile, link) && !proximity.contains(link.build)){
|
||||||
link.build.configure(tile.pos());
|
link.build.configure(tile.pos());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -178,7 +178,6 @@ public class StackConveyor extends Block implements Autotiler{
|
|||||||
}
|
}
|
||||||
proxUpdating = false;
|
proxUpdating = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -229,12 +229,12 @@ public class CoreBlock extends StorageBlock{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean acceptItem(Building source, Item item){
|
public boolean acceptItem(Building source, Item item){
|
||||||
return items.get(item) < getMaximumAccepted(item) || incinerate();
|
return items.get(item) < getMaximumAccepted(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getMaximumAccepted(Item item){
|
public int getMaximumAccepted(Item item){
|
||||||
return storageCapacity;
|
return incinerate() ? storageCapacity * 2 : storageCapacity;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -270,10 +270,15 @@ public class CoreBlock extends StorageBlock{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleStack(Item item, int amount, Teamc source){
|
public void handleStack(Item item, int amount, Teamc source){
|
||||||
super.handleStack(item, amount, source);
|
int realAmount = Math.min(amount, storageCapacity - items.get(item));
|
||||||
|
super.handleStack(item, realAmount, source);
|
||||||
|
|
||||||
if(team == state.rules.defaultTeam && state.isCampaign()){
|
if(team == state.rules.defaultTeam && state.isCampaign()){
|
||||||
state.rules.sector.info.handleCoreItem(item, amount);
|
state.rules.sector.info.handleCoreItem(item, amount);
|
||||||
|
|
||||||
|
if(realAmount == 0){
|
||||||
|
Fx.coreBurn.at(x, y);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -377,7 +382,7 @@ public class CoreBlock extends StorageBlock{
|
|||||||
state.rules.sector.info.handleCoreItem(item, 1);
|
state.rules.sector.info.handleCoreItem(item, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(items.get(item) >= getMaximumAccepted(item)){
|
if(items.get(item) >= storageCapacity){
|
||||||
//create item incineration effect at random intervals
|
//create item incineration effect at random intervals
|
||||||
if(!noEffect){
|
if(!noEffect){
|
||||||
incinerateEffect(this, source);
|
incinerateEffect(this, source);
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ import mindustry.world.*;
|
|||||||
import mindustry.world.blocks.storage.CoreBlock.*;
|
import mindustry.world.blocks.storage.CoreBlock.*;
|
||||||
import mindustry.world.meta.*;
|
import mindustry.world.meta.*;
|
||||||
|
|
||||||
|
import static mindustry.Vars.*;
|
||||||
|
|
||||||
public class StorageBlock extends Block{
|
public class StorageBlock extends Block{
|
||||||
|
|
||||||
public StorageBlock(String name){
|
public StorageBlock(String name){
|
||||||
@@ -57,6 +59,24 @@ public class StorageBlock extends Block{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void itemTaken(Item item){
|
||||||
|
if(linkedCore != null){
|
||||||
|
linkedCore.itemTaken(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int removeStack(Item item, int amount){
|
||||||
|
int result = super.removeStack(item, amount);
|
||||||
|
|
||||||
|
if(linkedCore != null && team == state.rules.defaultTeam && state.isCampaign()){
|
||||||
|
state.rules.sector.info.handleCoreItem(item, -result);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getMaximumAccepted(Item item){
|
public int getMaximumAccepted(Item item){
|
||||||
return itemCapacity;
|
return itemCapacity;
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
2
fastlane/metadata/android/en-US/changelogs/29726.txt
Normal file
2
fastlane/metadata/android/en-US/changelogs/29726.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
- Fixed broken blocks increasing exponentially, leading to runaway memory usage/lag
|
||||||
|
- Fixed incorrect planet dialog layout on certain devices
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
org.gradle.daemon=true
|
org.gradle.daemon=true
|
||||||
org.gradle.jvmargs=-Xms256m -Xmx1024m
|
org.gradle.jvmargs=-Xms256m -Xmx1024m
|
||||||
archash=6742c2b110eeecd1934c42b5b1c87b00c911ecc4
|
archash=2d451f0c342755ef84e609c951a8fca654ef41b5
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user