├── .github └── workflows │ └── gradle.yml ├── .gitignore ├── DOWNLOAD.md ├── LICENSE ├── README.md ├── assets ├── bundles │ ├── bundle.properties │ └── bundle_ko.properties ├── icon.png ├── mod.json └── sprites │ ├── blocks │ ├── adapt-drill-rim.png │ ├── adapt-drill-rotator.png │ ├── adapt-drill-top.png │ ├── adapt-drill.png │ ├── armedFoundation-team.png │ ├── armedFoundation.png │ ├── armedNucleus-team.png │ ├── armedNucleus.png │ ├── armedShard-team.png │ ├── armedShard.png │ ├── explode-mine-team-top.png │ ├── explode-mine.png │ ├── multi-crafterator-bottom.png │ ├── multi-crafterator-liquid.png │ ├── multi-crafterator-top.png │ ├── multi-crafterator.png │ ├── multi-drill-icon.png │ ├── multi-drill-item.png │ ├── multi-drill-rim.png │ ├── multi-drill-rotator.png │ ├── multi-drill-top.png │ ├── multi-drill.png │ ├── shield-wall-top.png │ ├── shield-wall.png │ ├── turret │ │ ├── asclepius-baseIcon.png │ │ ├── asclepius-baseTurret.png │ │ ├── asclepius-heat.png │ │ ├── asclepius-icon.png │ │ ├── asclepius-outline.png │ │ ├── balkan-heat.png │ │ ├── balkan.png │ │ ├── clinicus-baseIcon.png │ │ ├── clinicus-baseTurret.png │ │ ├── clinicus-heat.png │ │ ├── clinicus-icon.png │ │ ├── clinicus-outline.png │ │ ├── conductron-baseIcon.png │ │ ├── conductron-baseTurret.png │ │ ├── conductron-heat.png │ │ ├── conductron-icon.png │ │ ├── conductron-outline.png │ │ ├── fossor-baseIcon.png │ │ ├── fossor-baseTurret.png │ │ ├── fossor-icon.png │ │ ├── fossor-outline.png │ │ ├── latusis-charge.png │ │ ├── latusis.png │ │ ├── marksman-baseIcon.png │ │ ├── marksman-baseTurret.png │ │ ├── marksman-icon.png │ │ ├── marksman-outline.png │ │ ├── multi-i-baseIcon.png │ │ ├── multi-i-baseTurret.png │ │ ├── multi-i-icon.png │ │ ├── multi-i-outline.png │ │ ├── traislar.png │ │ ├── trinity-baseIcon.png │ │ ├── trinity-baseTurret.png │ │ ├── trinity-icon.png │ │ └── trinity-outline.png │ └── variable-processor.png │ ├── effects │ ├── construct-back.png │ ├── construct.png │ ├── repair-laser-end.png │ ├── repair-laser.png │ ├── sEclipseCore-back.png │ ├── sEclipseCore.png │ ├── sGemini-back.png │ ├── sGemini.png │ ├── sMineMortar.png │ ├── tlaser-end.png │ ├── tlaser.png │ ├── tractM-laser-end.png │ └── tractM-laser.png │ ├── mounts │ ├── DrillM.png │ ├── arcM-heat.png │ ├── arcM.png │ ├── electLaserML.png │ ├── electLaserMR.png │ ├── forceShieldM-rotator-in.png │ ├── forceShieldM-rotator-out.png │ ├── hailM-heat.png │ ├── hailM.png │ ├── healBeamM-heat.png │ ├── healBeamM.png │ ├── healBeamM2L-heat.png │ ├── healBeamM2L.png │ ├── healBeamM2R-heat.png │ ├── healBeamM2R.png │ ├── healLaserM-heat.png │ ├── healLaserM.png │ ├── healLaserM2-heat.png │ ├── healLaserM2.png │ ├── healMissileML-heat.png │ ├── healMissileML.png │ ├── healMissileMR-heat.png │ ├── healMissileMR.png │ ├── laserM-heat.png │ ├── laserM.png │ ├── massM-full.png │ ├── massM-heat.png │ ├── massM.png │ ├── mineM.png │ ├── miniMassDriver-heat.png │ ├── miniMassDriver.png │ ├── miniRepairM.png │ ├── miniSegmentM.png │ ├── miniTractM.png │ ├── unoM.png │ └── waveM.png │ ├── statuses │ └── over-freezing.png │ ├── ui │ ├── bar-top.9.png │ ├── bar.9.png │ ├── barS-top.png │ └── barS.png │ └── units │ ├── momo-cell.png │ ├── momo.png │ ├── monopoly-cell.png │ ├── monopoly.png │ └── weapons │ ├── monopoly-weapon-mount.png │ └── monopoly-weapon.png ├── build.bat ├── build.gradle ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── preview.png └── src └── sharustry ├── Sharustry.java ├── ai └── types │ └── TractorAI.java ├── content ├── SBlocks.java ├── SBullets.java ├── SFx.java ├── SStatusEffects.java ├── STechTree.java ├── STurretMounts.java └── SUnitTypes.java ├── entities ├── bullet │ ├── AccelBulletType.java │ ├── EnergyBulletType.java │ ├── FieldBulletType.java │ ├── MountDriverBolt.java │ ├── ThermalLaserBulletType.java │ └── construct │ │ ├── AssaultConstructBulletType.java │ │ ├── ConstructBulletType.java │ │ ├── ForceShieldConstructBulletType.java │ │ ├── MineConstructBulletType.java │ │ ├── OverdriveConstructBulletType.java │ │ └── SupportConstructBulletType.java ├── data │ └── AmmoData.java ├── pattern │ └── ShootAside.java └── skills │ ├── Skill.java │ └── TurretSkill.java ├── graphics ├── Drawm.java ├── SPal.java └── ScaledEffect.java ├── type └── TractorUnitType.java ├── ui ├── MultiImageLabel.java ├── SBar.java └── SItemImage.java └── world └── blocks ├── defense ├── ExplodeMine.java ├── ShieldWall.java └── turret │ ├── DriverBulletData.java │ ├── GetlingTurret.java │ ├── HeatTractorBeamTurret.java │ ├── MultiConstructTurret.java │ ├── MultiTurret.java │ ├── SkillTurret.java │ ├── TemplatedTurret.java │ └── mounts │ ├── DrawMountTurret.java │ ├── DrillMountTurretType.java │ ├── ItemMountTurretType.java │ ├── LiquidMountTurretType.java │ ├── MassMountTurretType.java │ ├── MountTurretType.java │ ├── PointMountTurretType.java │ ├── PowerMountTurretType.java │ ├── RepairMountTurretType.java │ └── TractMountTurretType.java ├── logic └── VariableLogicBlock.java └── production ├── AttributeDrill.java └── MultipleDrill.java /.github/workflows/gradle.yml: -------------------------------------------------------------------------------- 1 | name: Java CI with Gradle 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | pull_request: 7 | branches: [ master ] 8 | workflow_dispatch: 9 | 10 | jobs: 11 | build: 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - uses: actions/checkout@v2 16 | - name: Set up JDK 16 17 | uses: actions/setup-java@v1 18 | with: 19 | java-version: 16 20 | - name: Setup Android SDK Tools 21 | uses: android-actions/setup-android@v2.0.1 22 | env: 23 | ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true' 24 | - name: build-tools 25 | run: sdkmanager "build-tools;29.0.3" 26 | - name: Add Android SDK to PATH 27 | run: echo "${ANDROID_HOME}/build-tools/29.0.3" >> $GITHUB_PATH 28 | 29 | - name: Grant execute permissions 30 | run: | 31 | chmod +x gradlew 32 | 33 | - name: Build with Gradle 34 | run: ./gradlew deploy 35 | 36 | - name: Upload Build Artifact 37 | uses: actions/upload-artifact@v2.2.1 38 | with: 39 | name: sharustry built by action 40 | path: build/libs/[!raw-]*.jar 41 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.gradle/ 2 | /.idea/ 3 | /bin/ 4 | /bin/main/ 5 | /build/ 6 | /.settings/ 7 | .vscode/ 8 | .classpath 9 | .project -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Sharlotte 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # sharustry 2 | ![template](https://user-images.githubusercontent.com/60801210/110486164-bd0b1c00-812f-11eb-99d8-b3ccdf304bb6.png) 3 | [![GitHub all releases](https://img.shields.io/github/downloads/sharlottes/sharustry/total?color=ffd700&label=Sharustry&style=flat-square)](https://github.com/Sharlottes/sharustry/) 4 | 5 | [![Java CI with Gradle](https://github.com/sharlottes/Sharustry/workflows/Java%20CI%20with%20Gradle/badge.svg)](https://github.com/sharlottes/Sharustry/actions) 6 | [![Discord](https://img.shields.io/discord/704355237246402721.svg?logo=discord&logoColor=white&logoWidth=20&labelColor=7289DA&label=Discord)](https://discord.gg/RCCVQFW) 7 | [![GitHub all releases](https://img.shields.io/github/downloads/anuken/mindustry/total?label=Made%20on%20Mindustry&style=flat-square)](https://github.com/Anuken/Mindustry/) 8 | [![GitHub Repo stars](https://img.shields.io/github/stars/sharlottes/Sharustry?label=Please%20star%20me%21&style=social)](https://github.com/sharlottes/Sharustry/stargazers) 9 | 10 | ## TODO / 할 일 11 | - [x] finish the fosser, the mass multi turret 12 | - [x] finish accel processor 13 | - [ ] add 8 * 8 turret 14 | - [ ] add units 15 | - [x] add t1 unit 16 | - [x] add t2 unit 17 | - [ ] add t3 unit 18 | - 19 | [DOWNLOAD / 다운로드](./DOWNLOAD.md) -------------------------------------------------------------------------------- /assets/bundles/bundle.properties: -------------------------------------------------------------------------------- 1 | block.shar-variable-processor.name = Accel Processor 2 | block.shar-variable-processor.description = The processor that can accel instructions per tick, support ~ x2000. 3 | block.shar-variable-processor.details = h 4 | 5 | block.shar-balkan.name = Balkan 6 | block.shar-balkan.description = An experimental turret for firing various bullets. Has skills that trigger every few shots. 7 | block.shar-balkan.details = any problem can be solved by shooting more bullets 8 | block.shar-adapt-drill.name = Adaptive Drill 9 | block.shar-adapt-drill.description = Attribute selective drill that boosts efficiency with various Attribute types. 10 | block.shar-adapt-drill.details = The production time is relatively short, so the quality is lower than other contents. 11 | block.shar-multi-drill.name = Multi Drill 12 | block.shar-multi-drill.description = A drill than mines all materials under it at once. 13 | block.shar-multi-drill.details = Lots of work has gone into this. \n help, ideas, and functions from mal, sk, and qmel. 14 | block.shar-shield-wall.name = Shield Wall 15 | block.shar-shield-wall.description = A wall with a small force shield that regens after awhile. 16 | block.shar-shield-wall.details = Mixed with zerg lava. 17 | block.shar-multi-crafterator.name = Multi Crafterator 18 | block.shar-multi-crafterator.description = a crafter capable of generating its own power. 19 | block.shar-multi-crafterator.details = the multi craft + generator from multi lib by younggam. 20 | 21 | block.shar-multi-i.name = Aggregate 22 | block.shar-multi-i.description = A few small turrets mounted on a larger turret. 23 | block.shar-multi-i.details = Content from meep, PM! 24 | block.shar-conductron.name = Conductron 25 | block.shar-conductron.description = A multi turret. Shoots lasers, lightning, and accerating bullets. 26 | block.shar-conductron.details = sprite by mal! 27 | block.shar-trinity.name = Trinity 28 | block.shar-trinity.description = A supportive multi turret. Has a tractor beam, point defense laser, repair point, and mass driver. 29 | block.shar-trinity.details = you cannot shoot by controlling lol 30 | block.shar-clinicus.name = Clinicus 31 | block.shar-clinicus.description = A repair multi turret. Shoots burst laser bolts, support bullets, and has a repair point. 32 | block.shar-clinicus.details = sprite by MasterNo2, bullet sprite by ssim! 33 | block.shar-asclepius.name = Asclepius 34 | block.shar-asclepius.description = A stronger repair multi turret. Shoots burst laser bolts, heal artillery, support bullets, and has a repair point.. Has skills the trigger every few shots. 35 | block.shar-asclepius.details = sprite by MasterNo2, bullet sprite by ssim! 36 | block.shar-fossor.name = Fossor 37 | block.shar-fossor.description = A mass/mine multi turret. Shoots special construct. \ncannot link to mass driver. only can link to another multi turret that has mass mount. 38 | block.shar-fossor.details = Fos-sor. Fos-or. Fos or Pos. Possor... what 39 | block.shar-armedNucleus.name = Armed Nucleus 40 | block.shar-armedNucleus.description = A Core Nuclues armed with 4 hails and 4 laser turrets. Needs ammo and power input to fire.\n[red]Requires placement on a smaller core.[] 41 | block.shar-armedNucleus.details = no more flare rush 42 | block.shar-armedFoundation.name = Armed Foundation 43 | block.shar-armedFoundation.description = A Core Foundation armed with 4 laser bolt turrets and a repair point. Needs power input to fire.\n[red]Requires placement on a smaller core.[] 44 | block.shar-armedFoundation.details = heal go brr 45 | 46 | unit.shar-momo.name = Momo 47 | unit.shar-momo.description = 48 | unit.shar-momo.details = 49 | unit.shar-monopoly.name = Monopoly 50 | unit.shar-monopoly.description = 51 | unit.shar-monopoly.details = 52 | 53 | status.shar-over-freezing.name = Over Freezing 54 | status.shar-over-freezing.description = A status mixed with Shocked and Freezing. randomly lightning is created on units.\nonly for overFreezing field 55 | status.shar-over-freezing.details = sprite by sk! 56 | 57 | stat.shar.base-t = Base Turret 58 | stat.shar.mini-t = Mounted Turrets 59 | stat.shar.ammo-shot = Ammo/shot 60 | stat.shar.chargeTime = chargeTime 61 | stat.shar.power = Power 62 | stat.shar.seconds = seconds 63 | stat.shar.damage = {0} /sec 64 | stat.shar.range = {0} blocks 65 | stat.shar.targetsBullet = Targets Bullet 66 | stat.shar.skillreload = [lightgray]Skill Rate:[] {0} 67 | stat.shar.burstshoot.name = Burst Shoot 68 | stat.shar.burstshoot.description = burst accel bullets randomly 69 | stat.shar.overfreezing.name = Over Freezing Field 70 | stat.shar.overfreezing.description = deploy over freezing field 71 | stat.shar.burstamount = [lightgray]Bullet Amount:[] {0} 72 | stat.shar.fieldstatus = [lightgray]Field Status:[] 73 | stat.shar.receiveRange = [lightgray]Receive Range:[] {0} 74 | stat.shar.constructamount = [lightgray]Construction Amount:[] {0} 75 | stat.shar.shieldreceive.name = Shield Receive Field 76 | stat.shar.shieldreceive.description = Receive force shield to near units.\n[red]doesn't be saved in save file[].\nforce shield will works as an ability. 77 | stat.shar.fireforce.name = Force Construction 78 | stat.shar.fireforce.description = fire construction that has force shield, slow regenerate.\ncan destroyed by segment. 79 | stat.shar.fireassault.name = Assault Construction 80 | stat.shar.fireassault.description = fire construction that fire incendiary bullet,\nrotates 360 degrees and fires everywhere.\ncan destroyed by segment. 81 | 82 | bar.attribute = {1} Attribute: + {0}% 83 | bar.drillspeeditem = {1} Speed: {0}/{2}s 84 | bar.shield = Shield 85 | bar.shar-reload = Reload: {0}% 86 | bar.shar-charge = Charge: {0}% 87 | bar.shar-skillReload = Skill Count: 88 | 89 | ui.itemnotfound = [red]not found [] 90 | 91 | shar-stat.health = Health: {0} 92 | shar-stat.shield = Shield: {0} 93 | shar-stat.payloadCapacity = Payloads: {0} / {1} 94 | -------------------------------------------------------------------------------- /assets/bundles/bundle_ko.properties: -------------------------------------------------------------------------------- 1 | block.shar-variable-processor.name = 가속 프로세서 2 | block.shar-variable-processor.description = 실행문 처리 속도를 가속시키는 프로세서입니다. 2000배까지 지원합니다. 3 | block.shar-variable-processor.details = h 4 | 5 | block.shar-balkan.name = 발칸 6 | block.shar-balkan.description = 다양한 탄환을 발사하기 위한 실험용 프로토타입 포탑입니다. 7 | block.shar-balkan.details = 8 | block.shar-adapt-drill.name = 적응성 드릴 9 | block.shar-adapt-drill.description = 다양한 친화성으로 효율을 가속할 수 있는 친화성 선택형 드릴입니다. 10 | block.shar-adapt-drill.details = 제작 시간이 비교적 짧아서 다른 콘텐츠에 비해 퀄리티가 떨어진다. 11 | block.shar-multi-drill.name = 다중 드릴 12 | block.shar-multi-drill.description = 캘 수 있는 모든 광물들을 특정 주기마다 채광하는 드릴입니다. 13 | block.shar-multi-drill.details = 많은 도움과 아이디어, 기능 추가와 삭제가 거듭된 작품. 도와준 분들: mal와 sk, qmel 14 | block.shar-shield-wall.name = 방어막 벽 15 | block.shar-shield-wall.description = hp를 보호해줄 수 있는 방어막을 가진 벽입니다. 2초 동안 피해를 입지 않는다면 재생합니다. 16 | block.shar-shield-wall.details = 약간 사기다 17 | block.shar-multi-crafterator.name = 다중 공장발전기 18 | block.shar-multi-crafterator.description = 공장 레시피를 선택할 수 있는 공장 & 발전기입니다. 19 | block.shar-multi-crafterator.detail = 군바하신 영감님의 걸작 중 하나 20 | 21 | block.shar-multi-i.name = 집합체 22 | block.shar-multi-i.description = 큰 포탑 위에 작은 포탑들이 장착된 집합형 다중 포탑입니다. 23 | block.shar-multi-i.details = meep의 PM 에서 양도받은 포탑 24 | block.shar-conductron.name = 도체자 25 | block.shar-conductron.description = 두번째 다중 포탑. 레이저와 전격, 가속탄을 발사합니다. 26 | block.shar-conductron.details = 이름 추천받아요.. 너무 어색함...\n스프라이터: mal 27 | block.shar-trinity.name = 트리니티 28 | block.shar-trinity.description = 서포터 포탑. 유닛 견인/탄환 요격/유닛 치료 레이저를 발사합니다. 29 | block.shar-trinity.details = 직접 조종해서 발사할 수 없다 30 | block.shar-fossor.name = 포서 31 | block.shar-fossor.description = 매스/채광 다중포탑. 특별한 구조물을 발사합니다. \n매스 드라이버와 연결할 수 없습니다. 매스 보조포탑을 가진 다른 다중포탑에만 연결할 수 있습니다.\ 32 | block.shar-fossor.details = Fos-sor. Fos-or. Fos or Pos. Possor... 음? 33 | block.shar-clinicus.name = 클리니쿠스 34 | block.shar-clinicus.description = 치료 포탑. 유닛 치료 레이저와 3점사 치료 빔, 작은 보조 구조물을 발사합니다. 35 | block.shar-clinicus.details = 스프라이터: MasterNo2, ssim(탄환) 36 | block.shar-asclepius.name = 아스클레피오스 37 | block.shar-asclepius.description = 2티어 치료 포탑. 더 강력한 레이저와 더 많은 치료 빔을 발사하고, 미사일을 발사합니다. 더 크고 더 많은 보조 구조물을 발사합니다. 38 | block.shar-asclepius.details = 스프라이터: MasterNo2, ssim(탄환) 39 | 40 | block.shar-armedNucleus.name = 중무장 코어: 핵심 41 | block.shar-armedNucleus.description = 4개의 레이저 포탑과 4개의 헤일을 가진 핵심 코어입니다. 탄약과 전력 공급이 필요합니다. \n [red]더 작은 코어가 필요합니다.[] 42 | block.shar-armedNucleus.details = ???: 더 이상의 플레어 러쉬는 없다. 43 | block.shar-armedFoundation.name = 중무장 코어: 기반 44 | block.shar-armedFoundation.description = 1개의 수리 레이저 포탑과 4개의 레이저 볼트 포탑을 가진 기반 코어입니다. 전력 공급이 필요합니다. \n [red]더 작은 코어가 필요합니다.[] 45 | block.shar-armedFoundation.details = heal go brr 46 | 47 | unit.shar-momo.name = 모모 48 | unit.shar-momo.description = 49 | unit.shar-momo.details = 50 | unit.shar-monopoly.name = 모노폴리 51 | unit.shar-monopoly.description = 52 | unit.shar-monopoly.details = 53 | 54 | status.shar-over-freezing.name = 과냉각 55 | status.shar-over-freezing.description = 감전과 냉각을 섞은 상태이상입니다. 유닛에 랜덤으로 전격을 생성합니다.\n과냉각 필드를 위한 상태이상입니다. 56 | status.shar-over-freezing.details = 스프라이터: sk 57 | 58 | stat.shar.base-t = 주 포탑 59 | stat.shar.mini-t = 보조 포탑 60 | stat.shar.ammo-shot = 발사 당 탄약 수 61 | stat.shar.chargeTime = 충전 시간 62 | stat.shar.power = 전력 63 | stat.shar.seconds = 초 64 | stat.shar.damage = {0} /초 65 | stat.shar.range = {0} 칸 66 | stat.shar.targetsBullet = 탄환 조준 67 | stat.shar.skillreload = [accent]스킬 주기[]: {0} 68 | stat.shar.burstshoot-name = 난사 69 | stat.shar.overfreezing-name = 과냉각 필드 70 | stat.shar.burstshoot-description = 가속탄을 랜덤하게 난사합니다. 71 | stat.shar.overfreezing-description = 과냉각 필드를 전개합니다. 72 | stat.shar.burstamount = [lightgray]탄환 수:[] {0} 73 | stat.shar.fieldstatus = [lightgray]필드 상태이상:[] 74 | stat.shar.receiveRange = [lightgray]부여 사거리:[] {0} 75 | stat.shar.constructamount = [lightgray]구조물 수:[] {0} 76 | stat.shar.shieldreceive.name = 보호막 부여 필드 77 | stat.shar.shieldreceive.description = 주변 유닛에 보호막을 부여합니다, [red]세이브 파일에 저장되지 않습니다[].\n보호막은 유닛 능력으로써 작동됩니다. 78 | stat.shar.fireforce.name = 보호막 구조물 79 | stat.shar.fireforce.description = 보호막을 가진 구조물을 발사합니다.\n세그먼트에 의해 파괴될 수 있습니다. 80 | stat.shar.fireassault.name = 전투 구조물 81 | stat.shar.fireassault.description = 360도로 돌아가며 사방에 방화탄을 발사하는 구조물을 발사합니다.\n세그먼트에 의해 파괴될 수 있습니다. 82 | 83 | bar.attribute = {1} 친화성 : + {0}% 84 | bar.drillspeeditem = {1} 드릴 속도: {0}/{2}s 85 | bar.shield = 방어막 86 | bar.shar-reload = 재장전: {0}% 87 | bar.shar-charge = 충전: {0}% 88 | bar.shar-skillReload = 스킬 횟수: 89 | 90 | ui.itemnotfound = [red]찾을 수 없음.[] 91 | 92 | shar-stat.health = 체력: {0} 93 | shar-stat.shield = 방어막: {0} 94 | shar-stat.payloadCapacity = 화물: {0} / {1} -------------------------------------------------------------------------------- /assets/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/icon.png -------------------------------------------------------------------------------- /assets/mod.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "shar", 3 | "displayName": "Sharustry", 4 | "author": "Sharlottes", 5 | "description": "my first Java Mod. multi craft-generator, multi turret, multi drill and few thing more! \nnot completely finished/released yet. but i'm sure it's still enough for you to be interested in this mod, this contents, this ideas! \n\nThanks for helping: sk7725: owner of betaMindy \nmeep: owner of Progressed Materials \nmal&ssim: donated great sprites", 6 | "subtitle": "multi turrets", 7 | "version": "0.3v", 8 | "main": "sharustry.Sharustry", 9 | "minGameVersion": "146", 10 | "dependencies": [], 11 | "hidden": false, 12 | "java": true 13 | } 14 | -------------------------------------------------------------------------------- /assets/sprites/blocks/adapt-drill-rim.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/adapt-drill-rim.png -------------------------------------------------------------------------------- /assets/sprites/blocks/adapt-drill-rotator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/adapt-drill-rotator.png -------------------------------------------------------------------------------- /assets/sprites/blocks/adapt-drill-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/adapt-drill-top.png -------------------------------------------------------------------------------- /assets/sprites/blocks/adapt-drill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/adapt-drill.png -------------------------------------------------------------------------------- /assets/sprites/blocks/armedFoundation-team.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/armedFoundation-team.png -------------------------------------------------------------------------------- /assets/sprites/blocks/armedFoundation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/armedFoundation.png -------------------------------------------------------------------------------- /assets/sprites/blocks/armedNucleus-team.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/armedNucleus-team.png -------------------------------------------------------------------------------- /assets/sprites/blocks/armedNucleus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/armedNucleus.png -------------------------------------------------------------------------------- /assets/sprites/blocks/armedShard-team.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/armedShard-team.png -------------------------------------------------------------------------------- /assets/sprites/blocks/armedShard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/armedShard.png -------------------------------------------------------------------------------- /assets/sprites/blocks/explode-mine-team-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/explode-mine-team-top.png -------------------------------------------------------------------------------- /assets/sprites/blocks/explode-mine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/explode-mine.png -------------------------------------------------------------------------------- /assets/sprites/blocks/multi-crafterator-bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/multi-crafterator-bottom.png -------------------------------------------------------------------------------- /assets/sprites/blocks/multi-crafterator-liquid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/multi-crafterator-liquid.png -------------------------------------------------------------------------------- /assets/sprites/blocks/multi-crafterator-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/multi-crafterator-top.png -------------------------------------------------------------------------------- /assets/sprites/blocks/multi-crafterator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/multi-crafterator.png -------------------------------------------------------------------------------- /assets/sprites/blocks/multi-drill-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/multi-drill-icon.png -------------------------------------------------------------------------------- /assets/sprites/blocks/multi-drill-item.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/multi-drill-item.png -------------------------------------------------------------------------------- /assets/sprites/blocks/multi-drill-rim.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/multi-drill-rim.png -------------------------------------------------------------------------------- /assets/sprites/blocks/multi-drill-rotator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/multi-drill-rotator.png -------------------------------------------------------------------------------- /assets/sprites/blocks/multi-drill-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/multi-drill-top.png -------------------------------------------------------------------------------- /assets/sprites/blocks/multi-drill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/multi-drill.png -------------------------------------------------------------------------------- /assets/sprites/blocks/shield-wall-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/shield-wall-top.png -------------------------------------------------------------------------------- /assets/sprites/blocks/shield-wall.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/shield-wall.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/asclepius-baseIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/asclepius-baseIcon.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/asclepius-baseTurret.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/asclepius-baseTurret.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/asclepius-heat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/asclepius-heat.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/asclepius-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/asclepius-icon.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/asclepius-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/asclepius-outline.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/balkan-heat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/balkan-heat.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/balkan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/balkan.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/clinicus-baseIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/clinicus-baseIcon.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/clinicus-baseTurret.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/clinicus-baseTurret.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/clinicus-heat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/clinicus-heat.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/clinicus-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/clinicus-icon.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/clinicus-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/clinicus-outline.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/conductron-baseIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/conductron-baseIcon.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/conductron-baseTurret.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/conductron-baseTurret.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/conductron-heat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/conductron-heat.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/conductron-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/conductron-icon.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/conductron-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/conductron-outline.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/fossor-baseIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/fossor-baseIcon.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/fossor-baseTurret.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/fossor-baseTurret.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/fossor-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/fossor-icon.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/fossor-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/fossor-outline.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/latusis-charge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/latusis-charge.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/latusis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/latusis.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/marksman-baseIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/marksman-baseIcon.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/marksman-baseTurret.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/marksman-baseTurret.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/marksman-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/marksman-icon.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/marksman-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/marksman-outline.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/multi-i-baseIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/multi-i-baseIcon.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/multi-i-baseTurret.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/multi-i-baseTurret.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/multi-i-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/multi-i-icon.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/multi-i-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/multi-i-outline.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/traislar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/traislar.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/trinity-baseIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/trinity-baseIcon.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/trinity-baseTurret.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/trinity-baseTurret.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/trinity-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/trinity-icon.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turret/trinity-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/turret/trinity-outline.png -------------------------------------------------------------------------------- /assets/sprites/blocks/variable-processor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/blocks/variable-processor.png -------------------------------------------------------------------------------- /assets/sprites/effects/construct-back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/effects/construct-back.png -------------------------------------------------------------------------------- /assets/sprites/effects/construct.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/effects/construct.png -------------------------------------------------------------------------------- /assets/sprites/effects/repair-laser-end.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/effects/repair-laser-end.png -------------------------------------------------------------------------------- /assets/sprites/effects/repair-laser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/effects/repair-laser.png -------------------------------------------------------------------------------- /assets/sprites/effects/sEclipseCore-back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/effects/sEclipseCore-back.png -------------------------------------------------------------------------------- /assets/sprites/effects/sEclipseCore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/effects/sEclipseCore.png -------------------------------------------------------------------------------- /assets/sprites/effects/sGemini-back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/effects/sGemini-back.png -------------------------------------------------------------------------------- /assets/sprites/effects/sGemini.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/effects/sGemini.png -------------------------------------------------------------------------------- /assets/sprites/effects/sMineMortar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/effects/sMineMortar.png -------------------------------------------------------------------------------- /assets/sprites/effects/tlaser-end.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/effects/tlaser-end.png -------------------------------------------------------------------------------- /assets/sprites/effects/tlaser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/effects/tlaser.png -------------------------------------------------------------------------------- /assets/sprites/effects/tractM-laser-end.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/effects/tractM-laser-end.png -------------------------------------------------------------------------------- /assets/sprites/effects/tractM-laser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/effects/tractM-laser.png -------------------------------------------------------------------------------- /assets/sprites/mounts/DrillM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/DrillM.png -------------------------------------------------------------------------------- /assets/sprites/mounts/arcM-heat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/arcM-heat.png -------------------------------------------------------------------------------- /assets/sprites/mounts/arcM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/arcM.png -------------------------------------------------------------------------------- /assets/sprites/mounts/electLaserML.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/electLaserML.png -------------------------------------------------------------------------------- /assets/sprites/mounts/electLaserMR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/electLaserMR.png -------------------------------------------------------------------------------- /assets/sprites/mounts/forceShieldM-rotator-in.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/forceShieldM-rotator-in.png -------------------------------------------------------------------------------- /assets/sprites/mounts/forceShieldM-rotator-out.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/forceShieldM-rotator-out.png -------------------------------------------------------------------------------- /assets/sprites/mounts/hailM-heat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/hailM-heat.png -------------------------------------------------------------------------------- /assets/sprites/mounts/hailM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/hailM.png -------------------------------------------------------------------------------- /assets/sprites/mounts/healBeamM-heat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/healBeamM-heat.png -------------------------------------------------------------------------------- /assets/sprites/mounts/healBeamM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/healBeamM.png -------------------------------------------------------------------------------- /assets/sprites/mounts/healBeamM2L-heat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/healBeamM2L-heat.png -------------------------------------------------------------------------------- /assets/sprites/mounts/healBeamM2L.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/healBeamM2L.png -------------------------------------------------------------------------------- /assets/sprites/mounts/healBeamM2R-heat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/healBeamM2R-heat.png -------------------------------------------------------------------------------- /assets/sprites/mounts/healBeamM2R.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/healBeamM2R.png -------------------------------------------------------------------------------- /assets/sprites/mounts/healLaserM-heat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/healLaserM-heat.png -------------------------------------------------------------------------------- /assets/sprites/mounts/healLaserM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/healLaserM.png -------------------------------------------------------------------------------- /assets/sprites/mounts/healLaserM2-heat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/healLaserM2-heat.png -------------------------------------------------------------------------------- /assets/sprites/mounts/healLaserM2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/healLaserM2.png -------------------------------------------------------------------------------- /assets/sprites/mounts/healMissileML-heat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/healMissileML-heat.png -------------------------------------------------------------------------------- /assets/sprites/mounts/healMissileML.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/healMissileML.png -------------------------------------------------------------------------------- /assets/sprites/mounts/healMissileMR-heat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/healMissileMR-heat.png -------------------------------------------------------------------------------- /assets/sprites/mounts/healMissileMR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/healMissileMR.png -------------------------------------------------------------------------------- /assets/sprites/mounts/laserM-heat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/laserM-heat.png -------------------------------------------------------------------------------- /assets/sprites/mounts/laserM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/laserM.png -------------------------------------------------------------------------------- /assets/sprites/mounts/massM-full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/massM-full.png -------------------------------------------------------------------------------- /assets/sprites/mounts/massM-heat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/massM-heat.png -------------------------------------------------------------------------------- /assets/sprites/mounts/massM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/massM.png -------------------------------------------------------------------------------- /assets/sprites/mounts/mineM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/mineM.png -------------------------------------------------------------------------------- /assets/sprites/mounts/miniMassDriver-heat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/miniMassDriver-heat.png -------------------------------------------------------------------------------- /assets/sprites/mounts/miniMassDriver.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/miniMassDriver.png -------------------------------------------------------------------------------- /assets/sprites/mounts/miniRepairM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/miniRepairM.png -------------------------------------------------------------------------------- /assets/sprites/mounts/miniSegmentM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/miniSegmentM.png -------------------------------------------------------------------------------- /assets/sprites/mounts/miniTractM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/miniTractM.png -------------------------------------------------------------------------------- /assets/sprites/mounts/unoM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/unoM.png -------------------------------------------------------------------------------- /assets/sprites/mounts/waveM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/mounts/waveM.png -------------------------------------------------------------------------------- /assets/sprites/statuses/over-freezing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/statuses/over-freezing.png -------------------------------------------------------------------------------- /assets/sprites/ui/bar-top.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/ui/bar-top.9.png -------------------------------------------------------------------------------- /assets/sprites/ui/bar.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/ui/bar.9.png -------------------------------------------------------------------------------- /assets/sprites/ui/barS-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/ui/barS-top.png -------------------------------------------------------------------------------- /assets/sprites/ui/barS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/ui/barS.png -------------------------------------------------------------------------------- /assets/sprites/units/momo-cell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/units/momo-cell.png -------------------------------------------------------------------------------- /assets/sprites/units/momo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/units/momo.png -------------------------------------------------------------------------------- /assets/sprites/units/monopoly-cell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/units/monopoly-cell.png -------------------------------------------------------------------------------- /assets/sprites/units/monopoly.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/units/monopoly.png -------------------------------------------------------------------------------- /assets/sprites/units/weapons/monopoly-weapon-mount.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/units/weapons/monopoly-weapon-mount.png -------------------------------------------------------------------------------- /assets/sprites/units/weapons/monopoly-weapon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/assets/sprites/units/weapons/monopoly-weapon.png -------------------------------------------------------------------------------- /build.bat: -------------------------------------------------------------------------------- 1 | @rem put this project path into PATH_FROM 2 | setlocal 3 | set PATH_FROM=C:\Users\user\Documents\GitHub\sharustry 4 | @rem put your mindustry local path into PATH_TO 5 | setlocal 6 | set PATH_TO=C:\Users\user\AppData\Roaming\Mindustry 7 | 8 | if exist %PATH_TO%\mods\SharustryDesktop.jar del %PATH_TO%\mods\SharustryDesktop.jar 9 | xcopy %PATH_FROM%\build\libs\SharustryDesktop.jar %PATH_TO%\mods\ /k /y -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: "java" 2 | 3 | sourceSets { 4 | main.java.srcDir("src/") 5 | main.resources.srcDir("assets/") 6 | } 7 | 8 | ext { 9 | mindustryVersion = 'v146' 10 | artifactFilename = "Sharustry" 11 | sdkRoot = System.getenv("ANDROID_HOME") ?: System.getenv("ANDROID_SDK_ROOT") 12 | } 13 | 14 | java { 15 | targetCompatibility = 8 16 | sourceCompatibility = JavaVersion.VERSION_17 17 | } 18 | 19 | repositories { 20 | mavenCentral() 21 | maven { url "https://raw.githubusercontent.com/Zelaux/MindustryRepo/master/repository" } 22 | maven { url "https://jitpack.io" } 23 | } 24 | 25 | dependencies { 26 | compileOnly "com.github.Anuken.Mindustry:core:$mindustryVersion" 27 | compileOnly "com.github.Anuken.Arc:arc-core:$mindustryVersion" 28 | 29 | annotationProcessor 'com.github.Anuken:jabel:0.8.0' 30 | } 31 | 32 | jar { 33 | archiveFileName = "${artifactFilename}Desktop.jar" 34 | 35 | from{ 36 | configurations.runtimeClasspath.collect{ it.isDirectory() ? it : zipTree(it) } 37 | } 38 | } 39 | 40 | tasks.register('jarAndroid', Jar) { 41 | dependsOn "jar" 42 | 43 | doLast{ 44 | if(!sdkRoot || !new File(sdkRoot.toString()).exists()) throw new GradleException("No valid Android SDK found. Ensure that ANDROID_HOME is set to your Android SDK directory.") 45 | 46 | def platformRoot = new File("$sdkRoot/platforms/").listFiles().sort().reverse().find{ f -> new File(f, "android.jar").exists()} 47 | 48 | if(!platformRoot) throw new GradleException("No android.jar found. Ensure that you have an Android platform installed.") 49 | 50 | //collect dependencies needed for de-sugaring 51 | def dependencies = (configurations.compileClasspath.asList() + configurations.runtimeClasspath.asList() + [new File(platformRoot, "android.jar")]).collect{ "--classpath $it.path" }.join(" ") 52 | 53 | //dex and desugar files - this requires d8 in your PATH 54 | "d8 $dependencies --min-api 14 --output ${artifactFilename}Android.jar ${artifactFilename}Desktop.jar" 55 | .execute(null, new File("$buildDir/libs")).waitForProcessOutput(System.out, System.err) 56 | } 57 | } 58 | 59 | tasks.register('deploy', Jar) { 60 | dependsOn "jarAndroid" 61 | dependsOn "jar" 62 | 63 | archiveFileName.set("${artifactFilename}.jar") 64 | 65 | from{ [zipTree("$buildDir/libs/${artifactFilename}Desktop.jar"), zipTree("$buildDir/libs/${artifactFilename}Android.jar")] } 66 | 67 | doLast{ 68 | delete{ 69 | delete "$buildDir/libs/${artifactFilename}Desktop.jar" 70 | delete "$buildDir/libs/${artifactFilename}Android.jar" 71 | } 72 | } 73 | } 74 | 75 | tasks.withType(JavaCompile).configureEach { 76 | options.encoding = "UTF-8" 77 | options.compilerArgs += ["-Xlint:all"] 78 | if (JavaVersion.current() != JavaVersion.VERSION_1_8) { 79 | options.compilerArgs.addAll(['--release', '8']) 80 | } 81 | } -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # 4 | # Copyright 2015 the original author or authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | 19 | ############################################################################## 20 | ## 21 | ## Gradle start up script for UN*X 22 | ## 23 | ############################################################################## 24 | 25 | # Attempt to set APP_HOME 26 | # Resolve links: $0 may be a link 27 | PRG="$0" 28 | # Need this for relative symlinks. 29 | while [ -h "$PRG" ] ; do 30 | ls=`ls -ld "$PRG"` 31 | link=`expr "$ls" : '.*-> \(.*\)$'` 32 | if expr "$link" : '/.*' > /dev/null; then 33 | PRG="$link" 34 | else 35 | PRG=`dirname "$PRG"`"/$link" 36 | fi 37 | done 38 | SAVED="`pwd`" 39 | cd "`dirname \"$PRG\"`/" >/dev/null 40 | APP_HOME="`pwd -P`" 41 | cd "$SAVED" >/dev/null 42 | 43 | APP_NAME="Gradle" 44 | APP_BASE_NAME=`basename "$0"` 45 | 46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 48 | 49 | # Use the maximum available, or set MAX_FD != -1 to use that value. 50 | MAX_FD="maximum" 51 | 52 | warn () { 53 | echo "$*" 54 | } 55 | 56 | die () { 57 | echo 58 | echo "$*" 59 | echo 60 | exit 1 61 | } 62 | 63 | # OS specific support (must be 'true' or 'false'). 64 | cygwin=false 65 | msys=false 66 | darwin=false 67 | nonstop=false 68 | case "`uname`" in 69 | CYGWIN* ) 70 | cygwin=true 71 | ;; 72 | Darwin* ) 73 | darwin=true 74 | ;; 75 | MINGW* ) 76 | msys=true 77 | ;; 78 | NONSTOP* ) 79 | nonstop=true 80 | ;; 81 | esac 82 | 83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 84 | 85 | 86 | # Determine the Java command to use to start the JVM. 87 | if [ -n "$JAVA_HOME" ] ; then 88 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 89 | # IBM's JDK on AIX uses strange locations for the executables 90 | JAVACMD="$JAVA_HOME/jre/sh/java" 91 | else 92 | JAVACMD="$JAVA_HOME/bin/java" 93 | fi 94 | if [ ! -x "$JAVACMD" ] ; then 95 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 96 | Please set the JAVA_HOME variable in your environment to match the 97 | location of your Java installation." 98 | fi 99 | else 100 | JAVACMD="java" 101 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 102 | Please set the JAVA_HOME variable in your environment to match the 103 | location of your Java installation." 104 | fi 105 | 106 | # Increase the maximum file descriptors if we can. 107 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 108 | MAX_FD_LIMIT=`ulimit -H -n` 109 | if [ $? -eq 0 ] ; then 110 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 111 | MAX_FD="$MAX_FD_LIMIT" 112 | fi 113 | ulimit -n $MAX_FD 114 | if [ $? -ne 0 ] ; then 115 | warn "Could not set maximum file descriptor limit: $MAX_FD" 116 | fi 117 | else 118 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 119 | fi 120 | fi 121 | 122 | # For Darwin, add options to specify how the application appears in the dock 123 | if $darwin; then 124 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 125 | fi 126 | 127 | # For Cygwin or MSYS, switch paths to Windows format before running java 128 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then 129 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 130 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 131 | 132 | JAVACMD=`cygpath --unix "$JAVACMD"` 133 | 134 | # We build the pattern for arguments to be converted via cygpath 135 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 136 | SEP="" 137 | for dir in $ROOTDIRSRAW ; do 138 | ROOTDIRS="$ROOTDIRS$SEP$dir" 139 | SEP="|" 140 | done 141 | OURCYGPATTERN="(^($ROOTDIRS))" 142 | # Add a user-defined pattern to the cygpath arguments 143 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 144 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 145 | fi 146 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 147 | i=0 148 | for arg in "$@" ; do 149 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 150 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 151 | 152 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 153 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 154 | else 155 | eval `echo args$i`="\"$arg\"" 156 | fi 157 | i=`expr $i + 1` 158 | done 159 | case $i in 160 | 0) set -- ;; 161 | 1) set -- "$args0" ;; 162 | 2) set -- "$args0" "$args1" ;; 163 | 3) set -- "$args0" "$args1" "$args2" ;; 164 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;; 165 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 166 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 167 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 168 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 169 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 170 | esac 171 | fi 172 | 173 | # Escape application args 174 | save () { 175 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 176 | echo " " 177 | } 178 | APP_ARGS=`save "$@"` 179 | 180 | # Collect all arguments for the java command, following the shell quoting and substitution rules 181 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 182 | 183 | exec "$JAVACMD" "$@" -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | 44 | if "%ERRORLEVEL%" == "0" goto init 45 | 46 | echo. 47 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 48 | echo. 49 | echo Please set the JAVA_HOME variable in your environment to match the 50 | echo location of your Java installation. 51 | 52 | goto fail 53 | 54 | :findJavaFromJavaHome 55 | set JAVA_HOME=%JAVA_HOME:"=% 56 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 57 | 58 | if exist "%JAVA_EXE%" goto init 59 | 60 | 61 | echo. 62 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 63 | echo. 64 | echo Please set the JAVA_HOME variable in your environment to match the 65 | echo location of your Java installation. 66 | 67 | goto fail 68 | 69 | :init 70 | @rem Get command-line arguments, handling Windows variants 71 | 72 | if not "%OS%" == "Windows_NT" goto win9xME_args 73 | 74 | :win9xME_args 75 | @rem Slurp the command line arguments. 76 | set CMD_LINE_ARGS= 77 | set _SKIP=2 78 | 79 | :win9xME_args_slurp 80 | if "x%~1" == "x" goto execute 81 | 82 | set CMD_LINE_ARGS=%* 83 | 84 | :execute 85 | @rem Setup the command line 86 | 87 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 88 | 89 | 90 | @rem Execute Gradle 91 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 92 | 93 | 94 | :end 95 | @rem End local scope for the variables with windows NT shell 96 | if "%ERRORLEVEL%"=="0" goto mainEnd 97 | 98 | :fail 99 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 100 | rem the _cmd.exe /c_ return code! 101 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 102 | exit /b 1 103 | 104 | :mainEnd 105 | if "%OS%"=="Windows_NT" endlocal 106 | 107 | :omega -------------------------------------------------------------------------------- /preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sharlottes/sharustry/b190acc674c6c1196f98d65d26e74cd31f504e0e/preview.png -------------------------------------------------------------------------------- /src/sharustry/Sharustry.java: -------------------------------------------------------------------------------- 1 | package sharustry; 2 | 3 | import sharustry.content.*; 4 | import sharustry.world.blocks.defense.turret.mounts.MountTurretType; 5 | import arc.Events; 6 | import mindustry.game.EventType.*; 7 | import mindustry.mod.Mod; 8 | 9 | public class Sharustry extends Mod { 10 | public Sharustry(){ 11 | Events.on(ContentInitEvent.class, e -> { 12 | for(MountTurretType mount : STurretMounts.mounttypes) mount.init(); 13 | }); 14 | 15 | Events.on(ClientLoadEvent.class, e -> { 16 | for(MountTurretType mount : STurretMounts.mounttypes) mount.load(); 17 | }); 18 | } 19 | 20 | @Override 21 | public void loadContent(){ 22 | SBullets.load(); 23 | SStatusEffects.load(); 24 | STurretMounts.load(); 25 | SBlocks.load(); 26 | SUnitTypes.load(); 27 | STechTree.load(); 28 | } 29 | } -------------------------------------------------------------------------------- /src/sharustry/ai/types/TractorAI.java: -------------------------------------------------------------------------------- 1 | package sharustry.ai.types; 2 | 3 | import arc.math.*; 4 | import arc.math.geom.Position; 5 | import mindustry.ai.types.FlyingAI; 6 | import mindustry.entities.Units; 7 | import mindustry.gen.*; 8 | import mindustry.world.blocks.defense.turrets.Turret; 9 | 10 | import static mindustry.Vars.*; 11 | 12 | public class TractorAI extends FlyingAI { 13 | public float tractRange = 50 * 8; 14 | public float approach = 20 * 8; 15 | @Override 16 | public void moveTo(Position target, float circleLength, float smooth){ 17 | if(target == null) return; 18 | 19 | vec.set(target).sub(unit); 20 | 21 | float length = circleLength <= 0.001f ? 1f : Mathf.clamp((unit.dst(target) - circleLength) / smooth, -1f, 1f); 22 | 23 | vec.setLength(unit.speed() * length); 24 | if(length < -0.5f){ 25 | Building build = Units.findAllyTile(unit.team(), unit.x, unit.y, tractRange, b -> b instanceof Turret.TurretBuild && ((Turret.TurretBuild)b).hasAmmo()); 26 | 27 | vec.rotate(180f); 28 | if(build != null) unit.vel.trns(Angles.angle(((Unit)target).x, ((Unit)target).y, build.x, build.y), 2f); 29 | }else if(length < 0){ 30 | vec.setZero(); 31 | } 32 | 33 | unit.moveAt(vec); 34 | } 35 | 36 | @Override 37 | public void updateMovement() { 38 | Unit target = Units.closestEnemy(unit.team, unit.x, unit.y, tractRange, u -> true); 39 | 40 | if(target != null) { 41 | if(unit.hasWeapons()) { 42 | moveTo(target, Math.max(approach, Math.max(approach, target.hitSize())) - 16f, 16); 43 | unit.lookAt(target); 44 | } 45 | } else if (state.rules.waves && unit.team == state.rules.defaultTeam) { 46 | moveTo(getClosestSpawner(), state.rules.dropZoneRadius + 120f); 47 | } 48 | } 49 | } 50 | 51 | -------------------------------------------------------------------------------- /src/sharustry/content/SBullets.java: -------------------------------------------------------------------------------- 1 | package sharustry.content; 2 | 3 | import sharustry.entities.bullet.construct.AssaultConstructBulletType; 4 | import sharustry.entities.bullet.construct.ForceShieldConstructBulletType; 5 | import sharustry.entities.bullet.construct.SupportConstructBulletType; 6 | import sharustry.graphics.SPal; 7 | import arc.graphics.Color; 8 | import arc.graphics.g2d.Draw; 9 | import arc.math.Mathf; 10 | import mindustry.entities.bullet.*; 11 | import mindustry.entities.effect.MultiEffect; 12 | import mindustry.gen.*; 13 | import mindustry.content.*; 14 | 15 | import sharustry.entities.bullet.*; 16 | import mindustry.graphics.Drawf; 17 | import mindustry.graphics.Pal; 18 | 19 | public class SBullets { 20 | public static BulletType 21 | fossers, mountDriverBolt, force, assault, artilleryHealBig, artilleryHeal, 22 | jumbleBullet, miniAccelMissile, trailBullet, testLaser; 23 | 24 | public static void load(){ 25 | mountDriverBolt = new MountDriverBolt(); 26 | 27 | fossers = new ForceShieldConstructBulletType(){{ 28 | speed = 3.25f; 29 | damage = 120; 30 | sprite = "shar-sMineMortar"; 31 | skipCol = true; 32 | drag = 0.015f; 33 | 34 | lifetime = 10 * 60f; 35 | width = height = 10f; 36 | collidesTiles = false; 37 | splashDamageRadius = 35f * 0.75f; 38 | splashDamage = 12 * 8f; 39 | backColor = Color.orange; 40 | frontColor = Pal.accent; 41 | 42 | shieldColor = Color.valueOf("D6FFE4"); 43 | }}; 44 | 45 | artilleryHeal = new SupportConstructBulletType(3.25f, 50){{ 46 | sprite = "shar-construct"; 47 | drag = 0.0125f; 48 | 49 | fragSpacing *= 2f; 50 | tractForce = 8f; 51 | tractScaledForce = 7f; 52 | shootLength = 5f; 53 | pointBulletDamage = 9f; 54 | repairSpeed = 0.1f; 55 | repairRange = 45f; 56 | tractRange = 40f; 57 | pointRange = 35f; 58 | pointHitEffect = Fx.shootHeal; 59 | knockback = 2f; 60 | lifetime = 8 * 60f; 61 | width = height = 9f; 62 | collidesTiles = false; 63 | splashDamageRadius = 35f * 0.75f; 64 | splashDamage = 45f; 65 | fragBullets = 10; 66 | backColor = Pal.plastaniumBack; 67 | frontColor = Pal.plastaniumFront; 68 | mixColorFrom = Pal.plastanium.cpy().lerp(Pal.heal, 0.5f); 69 | mixColorTo = Pal.heal; 70 | fragBulletType = new LaserBoltBulletType(4.2f, 10){{ 71 | lifetime = 25f; 72 | healPercent = 5.5f; 73 | collidesTeam = true; 74 | backColor = Pal.heal; 75 | frontColor = Color.white; 76 | }}; 77 | }}; 78 | 79 | force = new ForceShieldConstructBulletType(){{ 80 | speed = 3.25f; 81 | damage = 120; 82 | sprite = "shar-sEclipseCore"; 83 | skipCol = true; 84 | drag = 0.015f; 85 | 86 | lifetime = 10 * 60f; 87 | width = height = 10f; 88 | collidesTiles = false; 89 | splashDamageRadius = 35f * 0.75f; 90 | splashDamage = 12 * 8f; 91 | backColor = Color.orange; 92 | frontColor = Pal.accent; 93 | 94 | shieldColor = Color.valueOf("D6FFE4"); 95 | }}; 96 | 97 | assault = new AssaultConstructBulletType(3.75f, 200f){{ 98 | sprite = "shar-sGemini"; 99 | drag = 0.015f; 100 | 101 | fragBulletType = new BasicBulletType(3.2f, 16, "bullet"){{ 102 | width = 10f; 103 | height = 12f; 104 | frontColor = Pal.lightishOrange; 105 | backColor = Pal.lightOrange; 106 | status = StatusEffects.burning; 107 | hitEffect = new MultiEffect(Fx.hitBulletSmall, Fx.fireHit); 108 | 109 | ammoMultiplier = 5; 110 | 111 | splashDamage = 10f; 112 | splashDamageRadius = 22f; 113 | 114 | makeFire = true; 115 | lifetime = 60f; 116 | }}; 117 | lifetime = 12 * 60f; 118 | width = height = 17f; 119 | collidesTiles = false; 120 | splashDamageRadius = 35f * 0.75f; 121 | splashDamage = 12 * 8f; 122 | backColor = Color.orange; 123 | frontColor = Pal.accent; 124 | mixColorFrom = Pal.accent.cpy().lerp(Pal.lightOrange, 0.5f); 125 | mixColorTo = Pal.lightOrange; 126 | }}; 127 | 128 | artilleryHealBig = new SupportConstructBulletType(4.25f, 150){{ 129 | sprite = "shar-construct"; 130 | drag = 0.0125f; 131 | 132 | despawnEffect = Fx.healWave; 133 | tractForce = 24f; 134 | tractScaledForce = 14f; 135 | shootLength = 5f; 136 | pointBulletDamage = 30f; 137 | repairSpeed = 0.35f; 138 | repairRange = 85f; 139 | tractRange = 80f; 140 | pointRange = 70f; 141 | pointHitEffect = Fx.shootHeal; 142 | knockback = 5f; 143 | lifetime = 15 * 60f; 144 | width = height = 13f; 145 | collidesTiles = false; 146 | splashDamageRadius = 35f * 0.75f; 147 | splashDamage = 45f; 148 | fragBullets = 10; 149 | backColor = Pal.plastaniumBack; 150 | frontColor = Pal.plastaniumFront; 151 | mixColorFrom = Pal.plastanium.cpy().lerp(Pal.heal, 0.5f); 152 | mixColorTo = Pal.heal; 153 | fragBulletType = new LaserBoltBulletType(5.2f, 5){{ 154 | lifetime = 35f; 155 | healPercent = 5.5f; 156 | collidesTeam = true; 157 | backColor = Pal.heal; 158 | frontColor = Color.white; 159 | }}; 160 | }}; 161 | 162 | jumbleBullet = new BasicBulletType(){{ 163 | ammoMultiplier = 3; 164 | speed = 2.5f; 165 | damage = 9; 166 | width = 5.5f; 167 | height = 7; 168 | lifetime = 60; 169 | shootEffect = Fx.shootSmall; 170 | smokeEffect = Fx.shootSmallSmoke; 171 | }}; 172 | 173 | miniAccelMissile = new AccelBulletType(2f, 5){{ 174 | backColor = SPal.cryoium.cpy().mul(Items.titanium.color); 175 | frontColor = trailColor = SPal.cryoium; 176 | shrinkY = 0f; 177 | width = 1.5f; 178 | height = 3.5f; 179 | hitSound = Sounds.explosion; 180 | trailChance = 0.45f; 181 | lifetime = 47f; 182 | sprite = "bullet"; 183 | pierceCap = 2; 184 | homing = true; 185 | }}; 186 | 187 | trailBullet = new EnergyBulletType(0, 1.5f){{ 188 | lifetime = 150f; 189 | height = 15f; 190 | width = 24f; 191 | drag = 1; 192 | trailColor = SPal.cryoium; 193 | hitEffect = Fx.none; 194 | despawnEffect = Fx.none; 195 | } 196 | @Override 197 | public void draw(Bullet b) { 198 | drawTrail(b); 199 | Draw.color(trailColor.cpy().a(0.75f-b.fin()/2)); 200 | 201 | for(int i : Mathf.signs) { 202 | Drawf.tri(b.x, b.y, height*(1-b.fin()), width, b.rotation()+Mathf.lerp(120, 150, b.fin())*i); 203 | } 204 | } 205 | }; 206 | 207 | 208 | testLaser = new ContinuousLaserBulletType(70){{ 209 | length = 200f; 210 | hitEffect = Fx.hitMeltdown; 211 | hitColor = Pal.meltdownHit; 212 | drawSize = 420f; 213 | 214 | incendChance = 0.4f; 215 | incendSpread = 5f; 216 | incendAmount = 1; 217 | }}; 218 | } 219 | } 220 | -------------------------------------------------------------------------------- /src/sharustry/content/SFx.java: -------------------------------------------------------------------------------- 1 | package sharustry.content; 2 | 3 | import sharustry.world.blocks.defense.ShieldWall; 4 | import arc.Core; 5 | import arc.graphics.Color; 6 | import arc.graphics.g2d.*; 7 | import arc.math.*; 8 | import arc.math.geom.Vec2; 9 | import arc.util.Structs; 10 | import arc.util.Tmp; 11 | import mindustry.content.Items; 12 | import mindustry.entities.*; 13 | import mindustry.entities.abilities.ForceFieldAbility; 14 | import mindustry.gen.Groups; 15 | import mindustry.graphics.*; 16 | import sharustry.graphics.*; 17 | 18 | import static arc.graphics.g2d.Draw.*; 19 | import static arc.graphics.g2d.Lines.*; 20 | import static arc.math.Angles.*; 21 | 22 | public class SFx { 23 | public static final Effect 24 | missileDead = new Effect(30, e -> { 25 | Lines.stroke(1.5f*e.fout(), Pal.lancerLaser); 26 | Lines.circle(e.x, e.y, e.fin()*12); 27 | }), 28 | mineExplode = new Effect(360, e -> { 29 | float cooldown = (float)e.data; 30 | float range = 4 * 8; 31 | e.scaled(cooldown, e1 -> { 32 | Draw.color(Pal.health, e1.fout(0.125f)); 33 | Lines.arc(e.x, e.y, range/3, 70 * (e1.fin(Interp.pow2)), 0, 60); 34 | }); 35 | 36 | if(e.time >= cooldown){ 37 | e.scaled(40 + cooldown, e1 ->{ 38 | Draw.color(Pal.health, e1.fout(40/e1.lifetime)); 39 | Lines.circle(e.x, e.y, range/3 + range*2/3 * (1-e1.fout(40/e1.lifetime))); 40 | }); 41 | } 42 | }), 43 | 44 | snipeLine = new Effect(10, e -> { 45 | e.lifetime = ((Float[])e.data)[0]; 46 | Lines.stroke(1.5f, Pal.lancerLaser.cpy().lerp(Pal.health, 0.75f).lerp(Color.white, Mathf.absin(1, e.fin() * 1.5f))); 47 | Vec2 tr = Tmp.v1.set(e.x, e.y).trns(e.rotation, ((Float[])e.data)[1]); 48 | Lines.line(e.x, e.y, e.x+tr.x, e.y+tr.y); 49 | }), 50 | 51 | distSplashFx = new Effect(80, e -> { 52 | Draw.color((Color) e.data, e.color, e.fin()); 53 | Lines.stroke(2 * e.fout()); 54 | Lines.circle(e.x, e.y, 85*e.fin()); 55 | }), 56 | 57 | skill = new Effect(40f, e -> { 58 | Draw.color(e.color); 59 | Fill.circle(e.x, e.y, 4 * e.fout()); 60 | 61 | if(e.fout() <= 0.5) { 62 | e.scaled(60, e1 -> { 63 | Lines.stroke(e.fout(0.5f) * 4); 64 | Lines.circle(e1.x, e1.y, -1 + (1 - e.fout(0.5f)) * 4); 65 | 66 | Angles.randLenVectors(e1.id, 8, 2 + 10 * (1 - e.fout(0.5f)), (x, y) -> Lines.lineAngle(e1.x + x, e1.y + y, Mathf.angle(x, y), ((0.5f - Math.abs((1 - e.fout(0.5f)) - 0.5f)) * 2) * 4 + 1)); 67 | }); 68 | } 69 | }), 70 | boost = new Effect(50f, e -> { 71 | color(SPal.cryoium(e)); 72 | Fill.square(e.x, e.y, e.fslope() * 4f, 45f); 73 | }), 74 | 75 | balkanShoot = new Effect(21f, e -> { 76 | color(SPal.cryoium(e)); 77 | for(int i : Mathf.signs) 78 | Drawf.tri(e.x, e.y, 4f * e.fout(), 29*1.5f, e.rotation + 90f * i); 79 | }), 80 | 81 | traislarShoot = new Effect(45f, e -> { 82 | for(int r : Mathf.signs) { 83 | for(int i = 0; i < 2; i++){ 84 | Draw.color(Pal.lancerLaser.cpy().lerp(Items.titanium.color,0.5f * i).a(1 - 0.5f * e.fin())); 85 | 86 | float m = 1 - 0.5f * i; 87 | float rot = e.rotation + Mathf.lerp(60, 30, e.fin()) * r; 88 | float w = 15 * e.fout() * m; 89 | Drawf.tri(e.x, e.y, w, (30 + 15) * m, rot + 180); 90 | Drawf.tri(e.x, e.y, w, 10 * m, rot); 91 | } 92 | 93 | Drawf.light(e.x, e.y, 60, Pal.bulletYellowBack, 0.6f * e.fout()); 94 | e.scaled(30f, ee -> Drawf.tri(e.x, e.y, 4 * ee.fout(), 29 * 1.5f, e.rotation + Mathf.lerp(90,120, ee.fin()) * r)); 95 | } 96 | }), 97 | 98 | balkanChargeBegin = new Effect(60f, 100f, e -> { 99 | stroke(e.fin(), SPal.cryoium(e)); 100 | Lines.circle(e.x, e.y, 4f + e.fout() * 6f); 101 | 102 | Fill.circle(e.x, e.y, e.fin() * 3f); 103 | color(); 104 | Fill.circle(e.x, e.y, e.fin() * 2f); 105 | }), 106 | balkanChargeCircles = new Effect(50, e -> { 107 | color(SPal.cryoium(e)); 108 | Fill.square(e.x, e.y, e.fslope() * 4f, 45f); 109 | stroke(e.fin()); 110 | e.scaled(38, e1 -> randLenVectors(e.id, 2, 1 +20f * e1.fout(), (x, y) -> Fill.circle(e1.x + x, e1.y + y, e1.fslope() * 2f + 0.5f))); 111 | }), 112 | 113 | blockShieldBreak = new Effect(35, e -> { 114 | if(!(e.data instanceof ShieldWall.ShieldWallBuild)) return; 115 | ShieldWall.ShieldWallBuild build = e.data(); 116 | 117 | float radius = build.block.size * build.block.size * 1.3f; 118 | 119 | e.scaled(16f, c -> { 120 | color(Pal.shield); 121 | stroke(c.fout() * 2f + 0.1f); 122 | 123 | randLenVectors(e.id, (int)(radius * 1.2f), radius / 2f + c.finpow() * radius * 1.25f, (x, y) -> lineAngle(c.x + x, c.y + y, Mathf.angle(x, y), c.fout() * 5 + 1f)); 124 | }); 125 | 126 | color(Pal.shield, e.fout()); 127 | stroke(e.fout()); 128 | Lines.circle(e.x, e.y, radius); 129 | }), 130 | 131 | shieldSpread = new Effect(360, e -> { 132 | float range = 100; 133 | 134 | e.scaled(60, e1 -> part1(e1, range)); 135 | part2(e, range); 136 | }), 137 | 138 | hitLaserS = new Effect(8, e -> { 139 | color(Color.white, SPal.paradium, e.fin()); 140 | stroke(0.25f + e.fout()); 141 | Lines.circle(e.x, e.y, e.fin() * 2f); 142 | }); 143 | 144 | public static void part2(Effect.EffectContainer eh, float range) { 145 | Color toCol = Pal.lancerLaser; 146 | 147 | eh.scaled(360, ea -> { 148 | ea.lifetime = 360; 149 | Draw.color(Pal.accent); 150 | 151 | ea.scaled(40, e1 -> Lines.arc(eh.x, eh.y, range, Mathf.round(70 * (e1.fin(Interp.pow2))), 0, 60)); 152 | if(ea.time >= 40){ 153 | ea.scaled(40 + 20, e1 ->{ 154 | Draw.color(Pal.accent, 1); 155 | Lines.circle(eh.x, eh.y, range * e1.fout(20/60f)); 156 | Draw.color(Pal.accent); 157 | }); 158 | } 159 | if(ea.time >= 60){ 160 | ea.scaled(60 + 60, e1 -> { 161 | Draw.alpha(0.1f); 162 | Color col = Pal.accent.cpy(); 163 | Color col1 = Pal.accent.cpy(); 164 | 165 | col.a = ea.fin(); 166 | col1.a = 0.7f * e1.fin() + 0.25f * Mathf.sin(ea.fin() * 30); 167 | 168 | col.lerp(toCol, 1- Mathf.sin(ea.fin() * 60)); 169 | col1.lerp(toCol,Mathf.sin(ea.fin() * 60)); 170 | 171 | Lines.circle(eh.x, eh.y, range * (e1.fout(30/40f))); 172 | Fill.light(eh.x, eh.y, Lines.circleVertices(range), range * ((0.5f - Math.abs((1 - e1.fout(30/40f)) - 0.5f)) * 2), col, col1); 173 | }); 174 | } 175 | ea.scaled(60 + 180, e2 -> Groups.unit.each(u -> Mathf.dst(ea.x, ea.y, u.x, u.y) <= range && Structs.contains(u.abilities, a -> a instanceof ForceFieldAbility), u -> { 176 | Color col1 = Pal.accent.cpy(); 177 | col1.a = 0.7f * e2.fin() + 0.25f * Mathf.sin(e2.fin() * 15); 178 | Draw.color(Pal.accent, col1, Mathf.sin(e2.fin() * 15)); 179 | Lines.circle(u.x, u.y, u.hitSize + 8 * Mathf.sin(e2.fin() * 15)); 180 | })); 181 | }); 182 | }; 183 | 184 | public static void part1(Effect.EffectContainer ew, float range) { 185 | float[] xy = {0f, 0f}; 186 | Groups.unit.each(u -> Mathf.dst(ew.x, ew.y, u.x, u.y) <= range && Structs.contains(u.abilities, a -> a instanceof ForceFieldAbility), target -> { 187 | long id = ew.id; 188 | float tx = target.x; 189 | float ty = target.y; 190 | float x0; 191 | float y0; 192 | float radius = target.hitSize * 1.3f; 193 | ew.scaled(30, e1 -> { 194 | xy[0] = Mathf.lerp(ew.x, tx, e1.fin(Interp.pow2)); 195 | xy[1] = Mathf.lerp(ew.y, ty, e1.fin(Interp.pow2)); 196 | }); 197 | x0 = xy[0]; 198 | y0 = xy[1]; 199 | Draw.color(Pal.accent, ew.fout(0.5f)); 200 | Drawf.laser(Core.atlas.find("laser"), Core.atlas.find("laser-end"), ew.x, ew.y, x0, y0, ew.fout(0.5f)); 201 | Draw.color(Pal.accent); 202 | 203 | if(ew.fout() <= 0.5) { 204 | ew.scaled(200, c -> { 205 | Draw.color(Pal.accent, ew.fout(0.5f)); 206 | Lines.stroke(ew.fout(0.5f) * 1.2f + 0.1f); 207 | Lines.circle(tx, ty, radius + (1 - ew.fout(0.5f)) * 8); 208 | 209 | Angles.randLenVectors(id, (int)2.5f * Mathf.round(radius * 0.25f), radius/2 + Interp.pow3Out.apply(1 - ew.fout(0.5f)) * radius * 1.25f, (x, y) -> Lines.lineAngle(tx + x, ty + y, Mathf.angle(x, y), ((0.5f - Math.abs((1 - ew.fout(0.5f)) - 0.5f)) * 2) * 5 + 1)); 210 | }); 211 | } 212 | }); 213 | } 214 | } 215 | -------------------------------------------------------------------------------- /src/sharustry/content/SStatusEffects.java: -------------------------------------------------------------------------------- 1 | package sharustry.content; 2 | 3 | import arc.graphics.Color; 4 | import arc.math.Mathf; 5 | import arc.util.Tmp; 6 | import mindustry.entities.Lightning; 7 | import mindustry.game.Team; 8 | import mindustry.gen.Unit; 9 | import mindustry.graphics.Pal; 10 | import mindustry.type.*; 11 | 12 | import static mindustry.content.StatusEffects.*; 13 | 14 | public class SStatusEffects { 15 | public static StatusEffect overFreezing; 16 | 17 | public static void load(){ 18 | overFreezing = new StatusEffect("over-freezing"){ 19 | { 20 | color = Color.valueOf("6ecdec").cpy().lerp(Pal.lancerLaser, 0.5f); 21 | speedMultiplier = 0.45f; 22 | healthMultiplier = 0.5f; 23 | transitionDamage = 40f; 24 | effectChance = 0.05f; 25 | 26 | init(() -> { 27 | opposite(melting, burning); 28 | 29 | affinity(blasted, ((unit, result, time) -> { 30 | unit.damagePierce(transitionDamage); 31 | result.set(overFreezing, time); 32 | })); 33 | 34 | affinity(freezing, ((unit, result, time) -> { 35 | result.set(overFreezing, Math.min(time + result.time, 300f)); 36 | })); 37 | }); 38 | effect = SFx.boost; 39 | } 40 | 41 | 42 | @Override 43 | public void update(Unit unit, float time){ 44 | float lightningDamage = 10; 45 | float lightning = 2; 46 | float lightningLength = 10; 47 | 48 | Color lightningColor = Pal.surge; 49 | int lightningLengthRand = 0; 50 | float lightningCone = 360f; 51 | float lightningAngle = 0f; 52 | 53 | super.update(unit, time); 54 | if(Mathf.chanceDelta(effectChance)){ 55 | Tmp.v1.rnd(unit.type.hitSize /2f); 56 | Tmp.v2.set(unit.x + Tmp.v1.x, unit.y + Tmp.v1.y); 57 | effect.at(Tmp.v2.x, Tmp.v2.y, unit.rotation); 58 | 59 | for(int i = 0; i < lightning; i++){ 60 | Lightning.create(Team.derelict, lightningColor, lightningDamage < 0 ? damage : lightningDamage, Tmp.v2.x, Tmp.v2.y, unit.rotation() + Mathf.range(lightningCone/2) + lightningAngle, (int) (lightningLength + Mathf.random(lightningLengthRand))); 61 | } 62 | } 63 | } 64 | }; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/sharustry/content/STechTree.java: -------------------------------------------------------------------------------- 1 | package sharustry.content; 2 | 3 | import static mindustry.content.Blocks.*; 4 | import static mindustry.content.TechTree.*; 5 | import static sharustry.content.SBlocks.*; 6 | 7 | public class STechTree { 8 | public static void load(){ 9 | node(laserDrill, () -> { 10 | node(adaptDrill, () -> { 11 | node(multiDrill); 12 | }); 13 | }); 14 | 15 | node(titaniumWall, () -> { 16 | node(shieldWall); 17 | }); 18 | 19 | node(segment, () -> { 20 | node(trinity); 21 | }); 22 | 23 | node(hail, () -> { 24 | node(jumble); 25 | }); 26 | 27 | node(lancer, () -> { 28 | node(balkan); 29 | node(conductron); 30 | }); 31 | 32 | node(ripple, () -> { 33 | node(clinicus, () -> { 34 | node(asclepius); 35 | }); 36 | }); 37 | } 38 | } -------------------------------------------------------------------------------- /src/sharustry/content/SUnitTypes.java: -------------------------------------------------------------------------------- 1 | package sharustry.content; 2 | 3 | import sharustry.ai.types.TractorAI; 4 | import sharustry.type.TractorUnitType; 5 | import arc.graphics.Color; 6 | import mindustry.content.Fx; 7 | import mindustry.entities.bullet.BulletType; 8 | import mindustry.entities.bullet.LaserBoltBulletType; 9 | import mindustry.gen.*; 10 | import mindustry.type.UnitType; 11 | import mindustry.type.Weapon; 12 | import mindustry.type.ammo.PowerAmmoType; 13 | 14 | import static sharustry.graphics.SPal.paradium; 15 | 16 | public class SUnitTypes { 17 | public static UnitType momo, monopoly; 18 | 19 | public static void load() { 20 | momo = new TractorUnitType("momo"){{ 21 | aiController = TractorAI::new; 22 | flying = true; 23 | drag = 0.06f; 24 | accel = 0.12f; 25 | speed = 1.5f; 26 | health = 100 * 1.5f; 27 | engineSize = 1.8f; 28 | engineOffset = 5f; 29 | range = 10 * 8f; 30 | 31 | ammoType = new PowerAmmoType(500); 32 | 33 | mineTier = 1; 34 | mineSpeed = 2.5f; 35 | 36 | constructor = UnitEntity::create; 37 | }}; 38 | 39 | monopoly = new TractorUnitType("monopoly"){{ 40 | aiController = TractorAI::new; 41 | 42 | tractRange = 8 * 30f; 43 | tractForce = 6f; 44 | tractScaledForce = 5f; 45 | 46 | flying = true; 47 | drag = 0.05f; 48 | speed = 2.6f; 49 | rotateSpeed = 15f; 50 | accel = 0.1f; 51 | range = 30 * 8f; 52 | health = 400 * 1.5f; 53 | buildSpeed = 0.5f; 54 | engineOffset = 6.5f; 55 | hitSize = 8f; 56 | lowAltitude = true; 57 | 58 | ammoType = new PowerAmmoType(750); 59 | 60 | mineTier = 2; 61 | mineSpeed = 3.5f; 62 | 63 | damage = 0.05f; 64 | 65 | targetAmount = 2; 66 | tractLaserWidth = 0.4f; 67 | 68 | BulletType beam = new LaserBoltBulletType(5.8f, 9){{ 69 | lifetime = 48f; 70 | backColor = paradium; 71 | frontColor = Color.white; 72 | 73 | smokeEffect = SFx.hitLaserS; 74 | hitEffect = SFx.hitLaserS; 75 | despawnEffect = SFx.hitLaserS; 76 | 77 | width *= 0.75f; 78 | height *= 0.75f; 79 | 80 | recoil = 0.3f; 81 | }}; 82 | 83 | weapons.add( 84 | new Weapon(name + "-weapon-mount"){{ 85 | top = false; 86 | shootY = 2f; 87 | x = 2f; 88 | y = 0.5f; 89 | reload = 30f; 90 | ejectEffect = Fx.none; 91 | recoil = 2f; 92 | shootSound = Sounds.lasershoot; 93 | alternate = false; 94 | shoot.shotDelay = 0.1f * 60; 95 | shoot.shots = 2; 96 | inaccuracy = 15f; 97 | bullet = beam; 98 | }}, 99 | new Weapon(name + "-weapon"){{ 100 | top = false; 101 | x = 3.5f; 102 | y = -2.5f; 103 | reload = 30f; 104 | ejectEffect = Fx.none; 105 | recoil = 2f; 106 | shootSound = Sounds.lasershoot; 107 | alternate = false; 108 | shoot.shotDelay = 0.1f * 60; 109 | shoot.shots = 2; 110 | inaccuracy = 15f; 111 | bullet = beam; 112 | }} 113 | ); 114 | 115 | constructor = UnitEntity::create; 116 | }}; 117 | } 118 | } 119 | -------------------------------------------------------------------------------- /src/sharustry/entities/bullet/AccelBulletType.java: -------------------------------------------------------------------------------- 1 | package sharustry.entities.bullet; 2 | 3 | import arc.graphics.Color; 4 | import arc.graphics.g2d.*; 5 | import arc.math.Angles; 6 | import arc.math.Interp; 7 | import arc.struct.Seq; 8 | import arc.util.*; 9 | import mindustry.content.*; 10 | import mindustry.entities.Units; 11 | import mindustry.entities.bullet.*; 12 | import mindustry.gen.*; 13 | import mindustry.graphics.*; 14 | import mindustry.world.blocks.defense.turrets.Turret; 15 | 16 | public class AccelBulletType extends BasicBulletType { 17 | public float pierceDec = 1, damageMultiplier = 1; 18 | public Color trailColors = Pal.lancerLaser; 19 | public boolean homing = false; 20 | 21 | public AccelBulletType(float speed, float damage){ 22 | this.speed = speed; 23 | this.damage = damage; 24 | hitEffect = Fx.hitBulletSmall; 25 | despawnEffect = Fx.hitBulletSmall; 26 | this.lifetime+=15f; 27 | } 28 | 29 | @Override 30 | public void init(Bullet b){ 31 | b.data = new BulletData(Seq.with(new Trail(6), new Trail(3)), 0); 32 | } 33 | 34 | @Override 35 | public void update(Bullet b) { 36 | super.update(b); 37 | if(b.time>=15f) { 38 | if (homing && b.owner instanceof Turret.TurretBuild build) { 39 | Posc target = build.target; 40 | if (target == null || ((BulletData)b.data).hitten) 41 | target = Units.closestTarget(b.team, b.x, b.y, 50, e -> e.checkTarget(collidesAir, collidesGround) && !b.hasCollided(e.id), t -> collidesGround && !b.hasCollided(t.id)); 42 | if (target != null) 43 | b.vel.setAngle(Angles.moveToward(b.rotation(), b.angleTo(target), ((BulletData) b.data).hitten ? 5 * Time.delta : Math.min(5, build.dst(target) / 8) * Time.delta)); 44 | } 45 | 46 | if(b.vel().len() < 15) b.vel().scl(1 + Interp.sineIn.apply(b.fin()) / 8); 47 | ((BulletData) b.data).trails.each(t -> t.update(b.x, b.y)); 48 | b.damage += 1 + Interp.sineIn.apply(b.fin()) * damageMultiplier; 49 | } 50 | } 51 | 52 | @Override 53 | public void hit(Bullet b, float x, float y){ 54 | b.damage *= pierceDec; 55 | super.hit(b,x,y); 56 | ((BulletData)b.data).hitten=true; 57 | } 58 | 59 | @Override 60 | public void draw(Bullet b){ 61 | super.draw(b); 62 | Draw.color(trailColors); 63 | ((BulletData)b.data).trails.each(t->t.draw(this.frontColor, this.width)); 64 | 65 | Fill.square(b.x, b.y, this.width, b.rotation()+45); 66 | } 67 | 68 | static class BulletData { 69 | Seq trails; 70 | int pierceCount; 71 | boolean hitten=false; 72 | public BulletData(Seq trails, int pierceCount) { 73 | this.trails = trails; 74 | this.pierceCount = pierceCount; 75 | } 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /src/sharustry/entities/bullet/EnergyBulletType.java: -------------------------------------------------------------------------------- 1 | package sharustry.entities.bullet; 2 | 3 | import mindustry.entities.bullet.BasicBulletType; 4 | import mindustry.gen.Bullet; 5 | 6 | public class EnergyBulletType extends BasicBulletType { 7 | public EnergyBulletType(float speed, float damage) { 8 | super(speed, damage); 9 | pierce = true; 10 | pierceBuilding = true; 11 | hittable = false; 12 | reflectable = false; 13 | } 14 | 15 | @Override 16 | public void update(Bullet b) { 17 | b.collided.clear(); 18 | super.update(b); 19 | b.hitSize=Math.min(width, height)*(1-b.fin()); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/sharustry/entities/bullet/FieldBulletType.java: -------------------------------------------------------------------------------- 1 | package sharustry.entities.bullet; 2 | 3 | import sharustry.content.SFx; 4 | import arc.graphics.Color; 5 | import arc.graphics.g2d.Draw; 6 | import arc.graphics.g2d.Fill; 7 | import arc.graphics.g2d.Lines; 8 | import arc.math.Angles; 9 | import arc.math.Mathf; 10 | import mindustry.content.Items; 11 | import mindustry.content.StatusEffects; 12 | import mindustry.entities.Effect; 13 | import mindustry.entities.Units; 14 | import mindustry.entities.bullet.BasicBulletType; 15 | import mindustry.gen.Bullet; 16 | import mindustry.graphics.Pal; 17 | import mindustry.type.StatusEffect; 18 | 19 | public class FieldBulletType extends BasicBulletType { 20 | public float damage = 0.5f; 21 | public float radius; 22 | public Color mainColor = Items.pyratite.color, subColor = Pal.lightOrange; 23 | public StatusEffect status = StatusEffects.none; 24 | public float statusDuration = 3 * 60; 25 | 26 | public FieldBulletType(float speed, float damage, float duration, float radius){ 27 | super(speed, damage); 28 | this.radius = radius; 29 | lifetime = duration; 30 | collidesTiles = false; 31 | collides = false; 32 | collidesAir = false; 33 | keepVelocity = false; 34 | } 35 | 36 | public void fillLight(float x, float y, int sides, float radius, Color center, Color edge){ 37 | float centerf = center.toFloatBits(), edgef = edge.toFloatBits(); 38 | sides = Mathf.ceil(sides / 2f) * 2; 39 | float space = 360f / sides; 40 | 41 | for(int i = 0; i < sides; i += 2){ 42 | float px = Angles.trnsx(space * i, radius); 43 | float py = Angles.trnsy(space * i, radius); 44 | float px2 = Angles.trnsx(space * (i + 1), radius); 45 | float py2 = Angles.trnsy(space * (i + 1), radius); 46 | float px3 = Angles.trnsx(space * (i + 2), radius); 47 | float py3 = Angles.trnsy(space * (i + 2), radius); 48 | Fill.quad(x, y, centerf, x + px, y + py, edgef, x + px2, y + py2, edgef, x + px3, y + py3, edgef); 49 | } 50 | } 51 | 52 | @Override 53 | public void draw(Bullet b){ 54 | Draw.color(mainColor); 55 | Lines.stroke(1); 56 | Lines.circle(b.x, b.y, Mathf.clamp((1 - b.fin()) * 20) * radius); 57 | 58 | fillLight(b.x, b.y, Lines.circleVertices(85), Mathf.clamp((1 - b.fin()) * 10) * 85, mainColor.cpy().a(0), subColor.cpy().a(0.7f + 0.25f * Mathf.sin(b.time() * 0.05f))); 59 | 60 | Draw.color(); 61 | } 62 | 63 | @Override 64 | public void hit(Bullet b, float x, float y) { 65 | 66 | } 67 | 68 | @Override 69 | public void despawned(Bullet b){ 70 | 71 | } 72 | 73 | @Override 74 | public void update(Bullet b){ 75 | if(b.time() % 80 <= 1 && b.lifetime() - b.time() > 100) SFx.distSplashFx.at(b.x, b.y, 0, mainColor, subColor); 76 | 77 | Units.nearbyEnemies(b.team, b.x, b.y, radius, e -> { 78 | if(status != StatusEffects.none && statusDuration >= 0.001f) e.apply(status, statusDuration); 79 | if(damage >= 0.001f) e.damage(damage); 80 | }); 81 | } 82 | 83 | @Override 84 | public void init(Bullet b){ 85 | if(b == null) return; 86 | 87 | new Effect(45, e -> fillLight(e.x, e.y, Lines.circleVertices(85), 85, Color.clear, mainColor.cpy().a(e.fout()))).at(b.x, b.y, 0); 88 | } 89 | } -------------------------------------------------------------------------------- /src/sharustry/entities/bullet/MountDriverBolt.java: -------------------------------------------------------------------------------- 1 | package sharustry.entities.bullet; 2 | 3 | import sharustry.world.blocks.defense.turret.DriverBulletData; 4 | import arc.graphics.*; 5 | import arc.math.*; 6 | import arc.util.Tmp; 7 | import mindustry.content.*; 8 | import mindustry.entities.bullet.MassDriverBolt; 9 | import mindustry.gen.*; 10 | 11 | import static mindustry.Vars.*; 12 | 13 | public class MountDriverBolt extends MassDriverBolt { 14 | @Override 15 | public void update(Bullet b){ 16 | //data MUST be an instance of DriverBulletData 17 | if(!(b.data() instanceof DriverBulletData data)){ 18 | hit(b); 19 | return; 20 | } 21 | float hitDst = 7f; 22 | 23 | //if the target is dead, just keep flying until the bullet explodes 24 | if(data.to.dead()) return; 25 | 26 | Tmp.v1.set(data.from.mounts.get(data.fromIndex).x, data.from.mounts.get(data.fromIndex).y); 27 | Tmp.v2.set(data.to.mounts.get(data.toIndex).x, data.to.mounts.get(data.toIndex).y); 28 | 29 | float baseDst = Tmp.v1.dst(Tmp.v2); 30 | float dst1 = b.dst(Tmp.v1); 31 | float dst2 = b.dst(Tmp.v2); 32 | 33 | boolean intersect = false; 34 | 35 | //bullet has gone past the destination point: but did it intersect it? 36 | if(dst1 > baseDst){ 37 | float angleTo = b.angleTo(Tmp.v2); 38 | float baseAngle = Tmp.v2.angleTo(Tmp.v1); 39 | 40 | //if angles are nearby, then yes, it did 41 | if(Angles.near(angleTo, baseAngle, 2f)){ 42 | intersect = true; 43 | //snap bullet position back; this is used for low-FPS situations 44 | b.set(Tmp.v2.x + Angles.trnsx(baseAngle, hitDst), Tmp.v2.y + Angles.trnsy(baseAngle, hitDst)); 45 | } 46 | } 47 | //if on course, and it's in range of the target 48 | if(Math.abs(dst1 + dst2 - baseDst) < 4f && dst2 <= hitDst){ 49 | intersect = true; 50 | } //else, bullet has gone off course, does not get received. 51 | 52 | if(intersect) data.to.handlePayload(b, data); 53 | } 54 | 55 | @Override 56 | public void despawned(Bullet b){ 57 | super.despawned(b); 58 | 59 | if(!(b.data() instanceof DriverBulletData data)) return; 60 | 61 | for(int i = 0; i < data.items.length; i++){ 62 | int amountDropped = Mathf.random(0, data.items[i]); 63 | if(amountDropped > 0){ 64 | float angle = b.rotation() + Mathf.range(100f); 65 | Fx.dropItem.at(b.x, b.y, angle, Color.white, content.item(i)); 66 | } 67 | } 68 | } 69 | } -------------------------------------------------------------------------------- /src/sharustry/entities/bullet/ThermalLaserBulletType.java: -------------------------------------------------------------------------------- 1 | package sharustry.entities.bullet; 2 | 3 | import mindustry.entities.bullet.*; 4 | import mindustry.gen.Bullet; 5 | 6 | public class ThermalLaserBulletType extends ContinuousLaserBulletType { 7 | 8 | public ThermalLaserBulletType(float damage){ 9 | super(damage); 10 | } 11 | 12 | public static class ThermalLaserBullet extends Bullet { 13 | @Override 14 | public void update() { 15 | super.update(); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/sharustry/entities/bullet/construct/AssaultConstructBulletType.java: -------------------------------------------------------------------------------- 1 | package sharustry.entities.bullet.construct; 2 | 3 | import sharustry.world.blocks.defense.turret.MultiConstructTurret; 4 | import arc.*; 5 | import arc.func.*; 6 | import arc.graphics.*; 7 | import arc.graphics.g2d.*; 8 | import arc.math.*; 9 | import arc.math.geom.*; 10 | import arc.util.*; 11 | import mindustry.Vars; 12 | import mindustry.entities.*; 13 | import mindustry.entities.bullet.*; 14 | import mindustry.gen.*; 15 | import mindustry.graphics.*; 16 | 17 | public class AssaultConstructBulletType extends ConstructBulletType { 18 | public BulletType fragBulletType; 19 | public float fragSpeed = 10f; 20 | 21 | public float range = 45f, minRange = 0, reload = 60; 22 | public BulletType bullet; 23 | public float burstSpacing = 5f, spread = 0f, velocityInaccuracy = 0f; 24 | 25 | public int shots = 3; 26 | public boolean alternate = false; 27 | 28 | public Color heatColor; 29 | public TextureRegion heatRegion; 30 | public float heatCooldown = 5; 31 | 32 | public Cons heatDrawer = b -> { 33 | if(((Float[])b.data)[2] <= 0.00001f) return; 34 | 35 | Draw.color(heatColor, ((Float[])b.data)[2]); 36 | Draw.blend(Blending.additive); 37 | Draw.rect(heatRegion, b.x, b.y, -90); 38 | Draw.blend(); 39 | Draw.color(); 40 | }; 41 | 42 | public AssaultConstructBulletType(float speed, float damage){ 43 | super(speed, damage); 44 | sprite = "shar-sGemini"; 45 | } 46 | 47 | @Override 48 | public void draw(Bullet b) { 49 | Color mix = Tmp.c1.set(mixColorFrom).lerp(mixColorTo, b.fin()); 50 | 51 | float offset = -90 + (spin != 0 ? Mathf.randomSeed(b.id, 360f) + b.time * spin : 0f); 52 | Draw.mixcol(mix, mix.a); 53 | Draw.color(backColor); 54 | Draw.rect(backRegion, b.x, b.y, width, height, b.rotation() + offset + b.vel.len() * 200 * ((Float[]) b.data)[3]); 55 | Draw.color(frontColor); 56 | Draw.rect(frontRegion, b.x, b.y, width, height, b.rotation() + offset + b.vel.len() * 200 * ((Float[]) b.data)[3]); 57 | 58 | Draw.reset(); 59 | if(heatRegion != Core.atlas.find("error")){ 60 | heatDrawer.get(b); 61 | } 62 | 63 | if(b.owner instanceof MultiConstructTurret.MultiConstructTurretBuild mutli && mutli.selected){ 64 | Drawf.dashCircle(b.x * Vars.tilesize, b.y * Vars.tilesize, range, Pal.placing); 65 | } 66 | } 67 | 68 | @Override 69 | public void init(Bullet b) { 70 | super.init(b); 71 | 72 | b.data = new Float[]{0f, 0f, 0f, Mathf.random(0.5f, 1), 0f}; //reloadCounter, shotCounter, heat for drawing, rotRand, frag 73 | } 74 | 75 | @Override 76 | public void update(Bullet b) { 77 | super.update(b); 78 | ((Float[])b.data)[2] = Mathf.lerpDelta(((Float[])b.data)[2], 0f, heatCooldown); 79 | Unit target = Units.closestEnemy(b.team, b.x, b.y, range, u -> u.checkTarget(collidesAir, collidesGround)); 80 | if(target != null && bullet != null){ 81 | shooting(bullet, b); 82 | } 83 | ((Float[])b.data)[4] += fragSpeed * Time.delta; 84 | if(fragBulletType != null){ 85 | final float j = ((Float[])b.data)[4]; 86 | Time.run(((Float[])b.data)[4] / 60f, ()-> fragBulletType.create(b, b.x + Angles.trnsx(j, 10), b.y + Angles.trnsy(j, 10), j, 0.25f, 1)); 87 | } 88 | } 89 | 90 | public void shooting(BulletType type, Bullet b){ 91 | Unit target = Units.closestEnemy(b.team, b.x, b.y, range, u -> u.checkTarget(collidesAir, collidesGround)); 92 | if(((Float[])b.data)[0] >= reload){ 93 | if(burstSpacing > 0.0001f){ 94 | for(int i = 0; i < shots; i++){ 95 | Time.run(burstSpacing * i, () -> { 96 | bullet(type, Angles.angle(b.x, b.y, target.x, target.y) + Mathf.range(inaccuracy), b); 97 | ((Float[])b.data)[2] = 1f; 98 | }); 99 | } 100 | 101 | }else{ 102 | //otherwise, use the normal shot pattern(s) 103 | if(alternate){ 104 | bullet(type, Mathf.range(inaccuracy), b); 105 | }else{ 106 | for(int i = 0; i < shots; i++){ 107 | bullet(type, Angles.angle(b.x, b.y, target.x, target.y) + Mathf.range(inaccuracy + type.inaccuracy) + (i - (int)(shots / 2f)) * spread, b); 108 | } 109 | } 110 | ((Float[])b.data)[1]++; 111 | ((Float[])b.data)[2] = 1f; 112 | } 113 | ((Float[])b.data)[0] = 0f; 114 | }else{ 115 | ((Float[])b.data)[0] += Time.delta * type.reloadMultiplier; 116 | } 117 | } 118 | 119 | public void bullet(BulletType type, float angle, Bullet b){ 120 | Unit pos = Units.closestEnemy(b.team, b.x, b.y, range, u -> u.checkTarget(collidesAir, collidesGround)); 121 | Vec2 targetPos = new Vec2(); 122 | float speed = bullet.speed; 123 | //slow bullets never intersect 124 | if(speed < 0.1f) speed = 9999999f; 125 | 126 | targetPos.set(Predict.intercept((Position) b, pos, speed)); 127 | if(targetPos.isZero()){ 128 | targetPos.set(pos); 129 | } 130 | float lifeScl = type.scaleLife ? Mathf.clamp(Mathf.dst(b.x, b.y, targetPos.x, targetPos.y) / type.range, minRange / type.range, range / type.range) : 1f; 131 | 132 | type.create(b, b.team, b.x, b.y, angle, 1f + Mathf.range(velocityInaccuracy), lifeScl); 133 | } 134 | } 135 | -------------------------------------------------------------------------------- /src/sharustry/entities/bullet/construct/ConstructBulletType.java: -------------------------------------------------------------------------------- 1 | package sharustry.entities.bullet.construct; 2 | 3 | import arc.Core; 4 | import arc.graphics.Color; 5 | import arc.graphics.g2d.Draw; 6 | import arc.graphics.g2d.TextureRegion; 7 | import arc.math.Mathf; 8 | import arc.util.Tmp; 9 | import mindustry.entities.bullet.BulletType; 10 | import mindustry.gen.Bullet; 11 | import mindustry.graphics.Pal; 12 | 13 | public class ConstructBulletType extends BulletType { 14 | public Color backColor = Pal.bulletYellowBack, frontColor = Pal.bulletYellow; 15 | public Color mixColorFrom = new Color(1f, 1f, 1f, 0f), mixColorTo = new Color(1f, 1f, 1f, 0f); 16 | public float width = 5f, height = 7f; 17 | public float spin = 0; 18 | public String sprite; 19 | 20 | public TextureRegion backRegion; 21 | public TextureRegion frontRegion; 22 | 23 | public ConstructBulletType(float speed, float damage, String bulletSprite){ 24 | super(speed, damage); 25 | this.sprite = bulletSprite; 26 | } 27 | 28 | public ConstructBulletType(float speed, float damage){ 29 | this(speed, damage, "shar-construct"); 30 | } 31 | 32 | public ConstructBulletType(){ 33 | this(1f, 1f, "shar-construct"); 34 | } 35 | 36 | @Override 37 | public void load(){ 38 | backRegion = Core.atlas.find(sprite + "-back"); 39 | frontRegion = Core.atlas.find(sprite); 40 | } 41 | 42 | @Override 43 | public void draw(Bullet b) { 44 | Color mix = Tmp.c1.set(mixColorFrom).lerp(mixColorTo, b.fin()); 45 | 46 | float offset = -90 + (spin != 0 ? Mathf.randomSeed(b.id, 360f) + b.time * spin : 0f); 47 | Draw.mixcol(mix, mix.a); 48 | if(backRegion != Core.atlas.find("error")) { 49 | Draw.color(backColor); 50 | Draw.rect(backRegion, b.x, b.y, width, height, b.rotation() + offset + b.vel.len() * 200 * Mathf.random(0.5f, 1)); 51 | } 52 | if(frontRegion != Core.atlas.find("error")) { 53 | Draw.color(frontColor); 54 | Draw.rect(frontRegion, b.x, b.y, width, height, b.rotation() + offset + b.vel.len() * 200 * Mathf.random(0.5f, 1)); 55 | } 56 | 57 | Draw.reset(); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/sharustry/entities/bullet/construct/ForceShieldConstructBulletType.java: -------------------------------------------------------------------------------- 1 | package sharustry.entities.bullet.construct; 2 | 3 | import arc.Core; 4 | import arc.func.Cons; 5 | import arc.graphics.Color; 6 | import arc.graphics.g2d.Draw; 7 | import arc.graphics.g2d.Lines; 8 | import arc.math.Mathf; 9 | import arc.math.geom.Intersector; 10 | import arc.util.Time; 11 | import arc.util.Tmp; 12 | import mindustry.content.Fx; 13 | import mindustry.gen.Bullet; 14 | import mindustry.gen.Groups; 15 | import mindustry.graphics.Layer; 16 | 17 | import static arc.graphics.g2d.Fill.*; 18 | 19 | public class ForceShieldConstructBulletType extends ConstructBulletType { 20 | public boolean skipCol = false; 21 | public float radius = 60f; 22 | public float regen = 0.4f; 23 | public float max = 500f; 24 | public float cooldown = 60f * 3; 25 | public Color shieldColor; 26 | 27 | public static Bullet paramBullet; 28 | public static ForceShieldConstructBulletType paramField; 29 | public static final Cons shieldConsumer = trait -> { 30 | if(trait.team != paramBullet.team && trait.type.absorbable && Intersector.isInsideHexagon(paramBullet.x, paramBullet.y, ((Float[])paramBullet.data)[2] * 2f, trait.x(), trait.y()) && ((Float[])paramBullet.data)[0] > 0){ 31 | trait.absorb(); 32 | Fx.absorb.at(trait); 33 | 34 | //break shield 35 | if(((Float[])paramBullet.data)[0] <= trait.damage()){ 36 | ((Float[])paramBullet.data)[0] -= paramField.cooldown * paramField.regen; 37 | 38 | Fx.forceShrink.at(paramBullet.x, paramBullet.y, ((Float[])paramBullet.data)[2], paramField.shieldColor); 39 | } 40 | 41 | ((Float[])paramBullet.data)[0] -= trait.damage(); 42 | ((Float[])paramBullet.data)[1] = 1f; 43 | } 44 | }; 45 | 46 | @Override 47 | public void update(Bullet b) { 48 | super.update(b); 49 | float realRad = ((Float[])b.data)[2]; 50 | if(((Float[])b.data)[0] < max){ 51 | ((Float[])b.data)[0] += Time.delta * regen; 52 | } 53 | 54 | ((Float[])b.data)[1] = Math.max(((Float[])b.data)[1] - Time.delta/10f, 0f); 55 | 56 | if(((Float[])b.data)[0] > 0){ 57 | ((Float[])b.data)[3] = Mathf.lerpDelta(((Float[])b.data)[3], 1f, 0.06f); 58 | paramBullet = b; 59 | paramField = this; 60 | checkRadius(b); 61 | 62 | Groups.bullet.intersect(b.x - realRad, b.y - realRad, realRad * 2f, realRad * 2f, shieldConsumer); 63 | }else{ 64 | ((Float[])b.data)[3] = 0f; 65 | } 66 | } 67 | 68 | @Override 69 | public void draw(Bullet b) { 70 | Color mix = Tmp.c1.set(mixColorFrom).lerp(mixColorTo, b.fin()); 71 | 72 | float offset = -90 + (spin != 0 ? Mathf.randomSeed(b.id, 360f) + b.time * spin : 0f); 73 | Draw.mixcol(mix, mix.a); 74 | if(!skipCol) Draw.color(backColor); 75 | if(backRegion != Core.atlas.find("error")) Draw.rect(backRegion, b.x, b.y, width, height, b.rotation() + offset + b.vel.len() * 200 * ((Float[]) b.data)[4]); 76 | if(!skipCol) Draw.color(frontColor); 77 | if(frontRegion != Core.atlas.find("error")) Draw.rect(frontRegion, b.x, b.y, width, height, b.rotation() + offset + b.vel.len() * 200 * ((Float[]) b.data)[4]); 78 | 79 | Draw.reset(); 80 | 81 | checkRadius(b); 82 | 83 | if(((Float[])b.data)[0] > 0){ 84 | Draw.z(Layer.shields); 85 | 86 | Draw.color(shieldColor, Color.white, Mathf.clamp(((Float[])b.data)[1])); 87 | 88 | if(Core.settings.getBool("animatedshields")){ 89 | poly(b.x, b.y, 6, ((Float[])b.data)[2]); 90 | }else{ 91 | Lines.stroke(1.5f); 92 | Draw.alpha(0.09f); 93 | poly(b.x, b.y, 6, radius); 94 | Draw.alpha(1f); 95 | Lines.poly(b.x, b.y, 6, radius); 96 | } 97 | } 98 | } 99 | 100 | @Override 101 | public void hit(Bullet b) { 102 | super.hit(b); 103 | checkRadius(b); 104 | Fx.forceShrink.at(b.x, b.y, ((Float[])b.data)[2], shieldColor); 105 | } 106 | 107 | @Override 108 | public void init(Bullet b) { 109 | super.init(b); 110 | 111 | b.data = new Float[]{0f, 0f, 0f, 0f, Mathf.random(0.5f, 1)}; //shield, shield alpha for drawing, realRad, radScl 112 | } 113 | 114 | public void checkRadius(Bullet b){ 115 | //timer2 is used to store radius scale as an effect 116 | ((Float[])b.data)[2] = ((Float[])b.data)[3] * radius; 117 | } 118 | } 119 | -------------------------------------------------------------------------------- /src/sharustry/entities/bullet/construct/MineConstructBulletType.java: -------------------------------------------------------------------------------- 1 | package sharustry.entities.bullet.construct; 2 | 3 | public class MineConstructBulletType extends ConstructBulletType { 4 | } 5 | -------------------------------------------------------------------------------- /src/sharustry/entities/bullet/construct/OverdriveConstructBulletType.java: -------------------------------------------------------------------------------- 1 | package sharustry.entities.bullet.construct; 2 | 3 | public class OverdriveConstructBulletType extends ConstructBulletType { 4 | } 5 | -------------------------------------------------------------------------------- /src/sharustry/entities/data/AmmoData.java: -------------------------------------------------------------------------------- 1 | package sharustry.entities.data; 2 | 3 | import mindustry.ctype.UnlockableContent; 4 | import mindustry.entities.bullet.BulletType; 5 | 6 | public class AmmoData { 7 | BulletType bullet; 8 | T ammo; 9 | } 10 | -------------------------------------------------------------------------------- /src/sharustry/entities/pattern/ShootAside.java: -------------------------------------------------------------------------------- 1 | package sharustry.entities.pattern; 2 | 3 | import arc.math.Mathf; 4 | import mindustry.entities.pattern.ShootPattern; 5 | 6 | public class ShootAside extends ShootPattern { 7 | @Override 8 | public void shoot(int totalShots, BulletHandler handler) { 9 | for (int side : Mathf.signs) { 10 | for (int i = 0; i < shots; i++) { 11 | handler.shoot(0, 0, side * 90, firstShotDelay + shotDelay * i); 12 | } 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/sharustry/entities/skills/Skill.java: -------------------------------------------------------------------------------- 1 | package sharustry.entities.skills; 2 | 3 | import arc.Core; 4 | 5 | public abstract class Skill { 6 | public String name, displayedName, description; 7 | 8 | public Skill(String name) { 9 | this.name = name; 10 | this.displayedName = Core.bundle.get("stat.shar."+name+".name"); 11 | this.description = Core.bundle.get("stat.shar."+name+".description"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/sharustry/entities/skills/TurretSkill.java: -------------------------------------------------------------------------------- 1 | package sharustry.entities.skills; 2 | 3 | import arc.func.Func; 4 | import arc.scene.ui.layout.Table; 5 | import mindustry.world.blocks.defense.turrets.Turret; 6 | 7 | public class TurretSkill extends Skill { 8 | public Func runner = build -> () -> {}; 9 | public int maxCount = 5; 10 | public TurretSkill(String name) { 11 | super(name); 12 | } 13 | 14 | public TurretSkill(String name, Func runner, int maxCounter) { 15 | super(name); 16 | this.runner = runner; 17 | this.maxCount = maxCounter; 18 | } 19 | 20 | public TurretSkill(String name, Func runner) { 21 | super(name); 22 | this.runner = runner; 23 | } 24 | 25 | public void stats(Table table) { 26 | 27 | } 28 | 29 | public void active(T build) { 30 | runner.get(build).run(); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/sharustry/graphics/Drawm.java: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) sk7725 2020 3 | This program is free software: you can redistribute it and/or modify 4 | it under the terms of the GNU General Public License as published by 5 | the Free Software Foundation, either version 3 of the License, or 6 | (at your option) any later version. 7 | This program is distributed in the hope that it will be useful, 8 | but WITHOUT ANY WARRANTY; without even the implied warranty of 9 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 | GNU General Public License for more details. 11 | You should have received a copy of the GNU General Public License 12 | along with this program. If not, see . 13 | */ 14 | package sharustry.graphics; 15 | 16 | import arc.Core; 17 | import arc.graphics.*; 18 | import arc.graphics.g2d.*; 19 | import mindustry.game.*; 20 | import mindustry.graphics.MultiPacker; 21 | import mindustry.world.*; 22 | /** @author sk7726 */ 23 | public class Drawm { 24 | /** Generates all team regions and returns the sharded team region for icon. */ 25 | public static void generateTeamRegion(MultiPacker packer, Block b){ 26 | PixmapRegion teamr = Core.atlas.getPixmap(b.name + "-team"); 27 | 28 | for(Team team : Team.all){ 29 | if(team.hasPalette){ 30 | Pixmap out = new Pixmap(teamr.width, teamr.height); 31 | for(int x = 0; x < teamr.width; x++){ 32 | for(int y = 0; y < teamr.height; y++){ 33 | int color = teamr.getRaw(x, y); 34 | int index = color == 0xffffffff ? 0 : color == 0xdcc6c6ff ? 1 : color == 0x9d7f7fff ? 2 : -1; 35 | out.setRaw(x, y, index == -1 ? teamr.getRaw(x, y) : team.palettei[index]); 36 | } 37 | } 38 | packer.add(MultiPacker.PageType.main, b.name + "-team-" + team.name, out); 39 | } 40 | } 41 | 42 | //force reloadCounter of team region 43 | b.load(); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/sharustry/graphics/SPal.java: -------------------------------------------------------------------------------- 1 | package sharustry.graphics; 2 | 3 | import arc.graphics.*; 4 | import arc.math.Mathf; 5 | import mindustry.content.Liquids; 6 | import mindustry.entities.*; 7 | import mindustry.graphics.Pal; 8 | 9 | public class SPal { 10 | 11 | public static Color cryoium(Effect.EffectContainer e) { 12 | return Liquids.cryofluid.color.cpy().lerp(Color.white.cpy().mul(0.25f, 0.25f, 1f, e.fout()), e.fout() / 6f + Mathf.randomSeedRange(e.id, 0.1f)); 13 | }; 14 | public static Color 15 | cryoium = Liquids.cryofluid.color.cpy().lerp(Color.white.cpy().mul(0.25f, 0.25f, 1f, 1f), Mathf.range(0.1f)), 16 | paradium = Pal.lancerLaser.cpy().lerp(Pal.sap, 0.5f); 17 | } 18 | -------------------------------------------------------------------------------- /src/sharustry/graphics/ScaledEffect.java: -------------------------------------------------------------------------------- 1 | package sharustry.graphics; 2 | 3 | import arc.func.Cons; 4 | import mindustry.entities.Effect; 5 | 6 | public class ScaledEffect extends Effect { 7 | public float scl; 8 | public ScaledEffect(float life, float clipsize, float scl, Cons renderer){ 9 | super(life, clipsize, renderer); 10 | this.scl = scl; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/sharustry/type/TractorUnitType.java: -------------------------------------------------------------------------------- 1 | package sharustry.type; 2 | 3 | import arc.Core; 4 | import arc.graphics.Color; 5 | import arc.graphics.g2d.Draw; 6 | import arc.graphics.g2d.TextureRegion; 7 | import arc.math.Angles; 8 | import arc.math.Mathf; 9 | import arc.struct.Seq; 10 | import arc.util.Time; 11 | import arc.util.Tmp; 12 | import mindustry.Vars; 13 | import mindustry.content.StatusEffects; 14 | import mindustry.entities.Units; 15 | import mindustry.gen.Unit; 16 | import mindustry.graphics.Drawf; 17 | import mindustry.graphics.Layer; 18 | import mindustry.type.StatusEffect; 19 | import mindustry.type.UnitType; 20 | 21 | public class TractorUnitType extends UnitType { 22 | public float tractRange = 8 * 10f; 23 | public float tractLaserWidth = 0.6f; 24 | public float tractForce = 4f; 25 | public float tractScaledForce = 3f; 26 | public float tractStatusDuration = 300; 27 | public float shootLength = 3f; 28 | public float damage = 0f; 29 | public int targetAmount = 1; 30 | 31 | public Color tractColor = Color.white; 32 | public StatusEffect tractStatus = StatusEffects.none; 33 | TextureRegion tractLaser, tractLaserEnd; 34 | 35 | public TractorUnitType(String name){ 36 | super(name); 37 | } 38 | 39 | @Override 40 | public void load() { 41 | super.load(); 42 | tractLaser = Core.atlas.find("shar-tlaser"); 43 | tractLaserEnd = Core.atlas.find("shar-tlaser-end"); 44 | } 45 | 46 | @Override 47 | public void draw(Unit unit) { 48 | super.draw(unit); 49 | 50 | Seq tractTargets = new Seq<>(); 51 | for(int i = 0; i < targetAmount; i++){ 52 | final int j = i; 53 | tractTargets.add(Units.closestEnemy(unit.team, unit.x, unit.y, tractRange, u -> { 54 | boolean istarget = true; 55 | if(j >= 1) istarget = u != tractTargets.get(j - 1); 56 | 57 | return istarget; 58 | })); 59 | } 60 | 61 | for(int i = 0; i < tractTargets.size; i++) { 62 | if (!unit.disarmed() 63 | && (unit.ammo > 0 || !Vars.state.rules.unitAmmo || unit.team().rules().infiniteAmmo) 64 | && tractTargets.get(i) != null 65 | && tractTargets.get(i).within(unit, tractRange + tractTargets.get(i).hitSize / 2f) 66 | && tractTargets.get(i).team() != unit.team 67 | && Angles.within(unit.rotation(), unit.angleTo(tractTargets.get(i)), 25)) { 68 | Draw.z(Layer.bullet); 69 | float ang = unit.angleTo(tractTargets.get(i).x, tractTargets.get(i).y); 70 | 71 | Draw.mixcol(tractColor, Mathf.absin(4f, 0.6f)); 72 | 73 | Drawf.laser(tractLaser, tractLaserEnd, 74 | unit.x + Angles.trnsx(ang, shootLength), unit.y + Angles.trnsy(ang, shootLength), 75 | tractTargets.get(i).x, tractTargets.get(i).y, unit.shieldAlpha * tractLaserWidth); 76 | Draw.mixcol(); 77 | } 78 | } 79 | } 80 | 81 | @Override 82 | public void update(Unit unit) { 83 | super.update(unit); 84 | 85 | Seq tractTargets = new Seq<>(); 86 | for(int i = 0; i < targetAmount; i++){ 87 | final int j = i; 88 | tractTargets.add(Units.closestEnemy(unit.team, unit.x, unit.y, tractRange, u -> { 89 | boolean istarget = true; 90 | if(j >= 1) istarget = u != tractTargets.get(j - 1); 91 | 92 | return istarget; 93 | })); 94 | } 95 | 96 | for(int i = 0; i < tractTargets.size; i++) { 97 | if (!unit.disarmed() 98 | && (unit.ammo > 0 || !Vars.state.rules.unitAmmo || unit.team().rules().infiniteAmmo) 99 | && tractTargets.get(i) != null 100 | && tractTargets.get(i).within(unit, tractRange + tractTargets.get(i).hitSize / 2f) 101 | && tractTargets.get(i).team() != unit.team 102 | && Angles.within(unit.rotation(), unit.angleTo(tractTargets.get(i)), 25)) { 103 | float dest = unit.angleTo(tractTargets.get(i)); 104 | unit.rotation(Angles.moveToward(unit.rotation, dest, rotateSpeed * Time.delta)); 105 | unit.shieldAlpha = Mathf.lerpDelta(unit.shieldAlpha, 1f, 0.1f); 106 | if (damage > 0) tractTargets.get(i).damageContinuous(damage); 107 | 108 | if (tractStatus != StatusEffects.none) tractTargets.get(i).apply(tractStatus, tractStatusDuration); 109 | tractTargets.get(i).impulseNet(Tmp.v1.set(unit).sub(tractTargets.get(i)).limit((tractForce + (1f - tractTargets.get(i).dst(unit) / tractRange) * tractScaledForce))); 110 | } else { 111 | unit.shieldAlpha = Mathf.lerpDelta(unit.shieldAlpha, 0, 0.1f); 112 | } 113 | unit.ammo--; 114 | if (unit.ammo < 0) unit.ammo = 0; 115 | } 116 | } 117 | } 118 | -------------------------------------------------------------------------------- /src/sharustry/ui/MultiImageLabel.java: -------------------------------------------------------------------------------- 1 | package sharustry.ui; 2 | 3 | import arc.graphics.g2d.TextureRegion; 4 | import arc.scene.ui.*; 5 | import arc.scene.ui.layout.Table; 6 | import arc.struct.Seq; 7 | import arc.util.Time; 8 | 9 | public class MultiImageLabel extends Table { 10 | final Seq displays = new Seq<>(); 11 | final Seq