├── .github ├── CODEOWNERS ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md └── workflows │ └── ci.yml ├── .gitignore ├── LICENSE ├── README.md ├── TRANSLATING.md ├── assets ├── bundles │ ├── bundle.properties │ ├── bundle_id_ID.properties │ ├── bundle_it.properties │ ├── bundle_ru_RU.properties │ ├── bundle_zh_CN.properties │ └── bundle_zh_TW.properties ├── icon.png ├── music │ ├── amplify.ogg │ ├── aspiration.ogg │ ├── boss1.ogg │ ├── boss2.ogg │ ├── boss3.ogg │ ├── boss4.ogg │ ├── bunny.ogg │ ├── cat.ogg │ ├── database.ogg │ ├── dawn.ogg │ ├── donpolo.ogg │ ├── dreamer.ogg │ ├── editor.ogg │ ├── fine.ogg │ ├── game1.ogg │ ├── game10.ogg │ ├── game11.ogg │ ├── game2.ogg │ ├── game3.ogg │ ├── game4.ogg │ ├── game5.ogg │ ├── game6.ogg │ ├── game7.ogg │ ├── game8.ogg │ ├── game9.ogg │ ├── hare.ogg │ ├── honey.ogg │ ├── land.ogg │ ├── launch.ogg │ ├── loadout.ogg │ ├── lose.ogg │ ├── menuaira.ogg │ ├── menucm.ogg │ ├── menuhoi4.ogg │ ├── menurcl.ogg │ ├── menure-aoh.ogg │ ├── moment.ogg │ ├── oriental.ogg │ ├── research.ogg │ ├── somedaySometime.ogg │ ├── t171.ogg │ ├── theme220.ogg │ ├── theme228.ogg │ ├── wave1.ogg │ ├── wave2.ogg │ ├── wave3.ogg │ ├── wave4.ogg │ └── win.ogg ├── sounds │ ├── queBom.mp3 │ ├── ui │ │ ├── back.ogg │ │ ├── chatMessage.ogg │ │ ├── press.ogg │ │ └── unlock.ogg │ └── units │ │ ├── collaris-arrival1.ogg │ │ ├── collaris-arrival2.ogg │ │ ├── collaris-attack1.ogg │ │ ├── collaris-attack2.ogg │ │ ├── collaris-attack3.ogg │ │ ├── collaris-death.ogg │ │ ├── collaris-hit1.ogg │ │ ├── collaris-hit2.ogg │ │ ├── collaris-hit3.ogg │ │ ├── collaris-pickup.ogg │ │ ├── toxopid-arrival1.ogg │ │ ├── toxopid-arrival2.ogg │ │ ├── toxopid-artillery.ogg │ │ ├── toxopid-attack1.ogg │ │ ├── toxopid-attack2.ogg │ │ ├── toxopid-attack3.ogg │ │ ├── toxopid-death.ogg │ │ ├── toxopid-hit1.ogg │ │ ├── toxopid-hit2.ogg │ │ ├── toxopid-hit3.ogg │ │ └── toxopid-pickup.ogg ├── sprites-override │ ├── effect │ │ └── error.png │ └── ui │ │ └── logo.png ├── sprites │ ├── arona-happy.png │ ├── creditpart.png │ ├── logo.png │ ├── mikalove.png │ ├── nekoui.png │ └── units │ │ ├── collaris-halo-heat.png │ │ ├── collaris-halo.png │ │ ├── tecta-halo-heat.png │ │ └── tecta-halo.png └── text │ └── messages.txt ├── build.gradle.kts ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── i18n ├── README.ID.md ├── README.IT.md ├── README.RU.md ├── README.zh_CN.md └── README.zh_TW.md ├── mod.json ├── settings.gradle.kts └── src └── bluearchive ├── ArchiveDustry.java ├── audio ├── ArchivDMusic.java ├── ArchivDSoundControl.java └── UnitSound.java ├── expansions └── exoprosopa │ ├── ADExoprosopa.java │ └── units │ └── ExopUnitHalo.java ├── l2d └── Live2DBackgrounds.java ├── ui ├── ArchivDStyles.java ├── ArchivDUI.java ├── dialogs │ ├── ArchivDCreditsDialog.java │ ├── ArchivDFirstTimeDialog.java │ ├── ArchivDLive2DManager.java │ └── ArchivDLive2DSelectionDialog.java └── overrides │ ├── ArchivDBackground.java │ ├── ArchivDLoadingFragment.java │ ├── ArchivDMenu.java │ └── ArchivDSettings.java └── units └── UnitHalo.java /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | @WilloIzCitron 2 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | custom: ['https://saweria.co/willoizcitron'] 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: Java CI 2 | 3 | on: 4 | push: 5 | pull_request: 6 | release: 7 | types: 8 | - created 9 | 10 | permissions: 11 | contents: write 12 | 13 | jobs: 14 | buildJar: 15 | name: Build and Publish Jar 16 | runs-on: ubuntu-latest 17 | steps: 18 | - uses: actions/checkout@v4 19 | - name: Set up JDK 17 20 | uses: actions/setup-java@v4 21 | with: 22 | java-version: 17 23 | distribution: temurin 24 | - name: Setup Gradle 25 | uses: gradle/actions/setup-gradle@v4 26 | - name: Build mod artifact 27 | run: | 28 | chmod +x gradlew 29 | ./gradlew clean dex 30 | - name: Upload built mod artifact as a GitHub Action artifact 31 | uses: actions/upload-artifact@v4 32 | if: github.event_name == 'push' || github.event_name == 'pull_request' 33 | with: 34 | name: ArchiveDustry (zipped) 35 | path: build/libs/ArchiveDustry-Java.jar 36 | if-no-files-found: error 37 | compression-level: 0 38 | - name: Upload built mod artifact into release 39 | uses: softprops/action-gh-release@v2 40 | if: github.event_name == 'release' && github.event.action == 'created' 41 | with: 42 | files: build/libs/ModTemplate.jar -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | logs/ 2 | /core/assets/mindustry-saves/ 3 | /core/assets/mindustry-maps/ 4 | /core/assets/bundles/output/ 5 | /core/assets/.gifimages/ 6 | /deploy/ 7 | /desktop/packr-out/ 8 | /desktop/packr-export/ 9 | /desktop/mindustry-saves/ 10 | /desktop/mindustry-maps/ 11 | /desktop/gifexport/ 12 | /core/lib/ 13 | /ios/assets/ 14 | /core/assets-raw/sprites/generated/ 15 | /core/assets-raw/sprites_out/ 16 | /annotations/build/ 17 | /annotations/out/ 18 | /net/build/ 19 | /tools/build/ 20 | /tests/build/ 21 | /server/build/ 22 | /test_files/ 23 | /annotations/build/ 24 | /desktop-sdl/build/ 25 | desktop-sdl/build/ 26 | /android/assets/mindustry-maps/ 27 | /android/assets/mindustry-saves/ 28 | /core/assets/gifexport/ 29 | /core/assets/version.properties 30 | /core/assets/locales 31 | /ios/src/io/anuke/mindustry/gen/ 32 | /core/src/io/anuke/mindustry/gen/ 33 | ios/robovm.properties 34 | packr-out/ 35 | config/ 36 | *.gif 37 | 38 | version.properties 39 | 40 | .attach_* 41 | ## Java 42 | 43 | *.class 44 | *.war 45 | *.ear 46 | hs_err_pid* 47 | crash-report-* 48 | replay_pid* 49 | 50 | ## Robovm 51 | /ios/robovm-build/ 52 | 53 | ## GWT 54 | /html/war/ 55 | /html/gwt-unitCache/ 56 | .apt_generated/ 57 | .gwt/ 58 | gwt-unitCache/ 59 | www-test/ 60 | .gwt-tmp/ 61 | 62 | ## Android Studio and Intellij and Android in general 63 | /android/libs/armeabi/ 64 | /android/libs/armeabi-v7a/ 65 | /android/libs/arm64-v8a/ 66 | /android/libs/x86/ 67 | /android/libs/x86_64/ 68 | /android/gen/ 69 | .idea/ 70 | *.ipr 71 | *.iws 72 | *.iml 73 | /android/out/ 74 | com_crashlytics_export_strings.xml 75 | 76 | ## Eclipse 77 | 78 | .classpath 79 | .project 80 | .metadata/ 81 | /android/bin/ 82 | /core/bin/ 83 | /desktop/bin/ 84 | /html/bin/ 85 | /ios/bin/ 86 | /ios-moe/bin/ 87 | *.tmp 88 | *.bak 89 | *.swp 90 | *~.nib 91 | .settings/ 92 | .loadpath 93 | .externalToolBuilders/ 94 | *.launch 95 | 96 | ## NetBeans 97 | 98 | /nbproject/private/ 99 | /android/nbproject/private/ 100 | /core/nbproject/private/ 101 | /desktop/nbproject/private/ 102 | /html/nbproject/private/ 103 | /ios/nbproject/private/ 104 | /ios-moe/nbproject/private/ 105 | 106 | /build/ 107 | /android/build/ 108 | /core/build/ 109 | /desktop/build/ 110 | /html/build/ 111 | /ios/build/ 112 | /ios-moe/build/ 113 | 114 | /nbbuild/ 115 | /android/nbbuild/ 116 | /core/nbbuild/ 117 | /desktop/nbbuild/ 118 | /html/nbbuild/ 119 | /ios/nbbuild/ 120 | /ios-moe/nbbuild/ 121 | 122 | /dist/ 123 | /android/dist/ 124 | /core/dist/ 125 | /desktop/dist/ 126 | /html/dist/ 127 | /ios/dist/ 128 | /ios-moe/dist/ 129 | 130 | /nbdist/ 131 | /android/nbdist/ 132 | /core/nbdist/ 133 | /desktop/nbdist/ 134 | /html/nbdist/ 135 | /ios/nbdist/ 136 | /ios-moe/nbdist/ 137 | 138 | nbactions.xml 139 | nb-configuration.xml 140 | 141 | ## Gradle 142 | 143 | /local.properties 144 | .gradle/ 145 | gradle-app.setting 146 | /build/ 147 | /android/build/ 148 | /core/build/ 149 | /desktop/build/ 150 | /html/build/ 151 | /ios/build/ 152 | /ios-moe/build/ 153 | 154 | ## OS Specific 155 | .DS_Store 156 | Thumbs.db 157 | android/libs/ 158 | ## Debuging Jar 159 | Mindustry.jar 160 | ## Personal Debuging Script 161 | debug.bat 162 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Tegas Aziz 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 | 2 | ![Archivedustry logo](/assets/sprites-override/ui/logo.png) 3 | 4 | [![Build Mod](https://github.com/WilloIzCitron/ArchiveDustry-Java/workflows/Build%20Mod/badge.svg)](https://github.com/WilloIzCitron/ArchiveDustry-Java/actions?query=workflow:"Build+Mod") 5 | [![GitHub release](https://img.shields.io/github/v/tag/WilloIzCitron/ArchiveDustry-Java?filter=%21server-%2A)](https://github.com/WilloIzCitron/ArchiveDustry-Java/releases/) 6 | [![License](https://img.shields.io/badge/License-MIT-blue)](https://github.com/WilloIzCitron/ArchiveDustry-Java/blob/master/LICENSE) 7 | [![issues - ArchiveDustry-Java](https://img.shields.io/github/issues/WilloIzCitron/ArchiveDustry-Java)](https://github.com/WilloIzCitron/ArchiveDustry-Java/issues) 8 | [![Stars - ArchiveDustry-Java](https://img.shields.io/github/stars/WilloIzCitron/ArchiveDustry-Java)](https://github.com/WilloIzCitron/ArchiveDustry-Java/stargazers) 9 | [![GitHub followers of WilloIzCitron](https://img.shields.io/github/followers/WilloIzCitron)](https://github.com/WilloIzCitron) 10 | 11 | > [!NOTE] 12 | > This Mod was being migrated from JSJavaScript was being archived, this mod are almost perfect. 13 | 14 | > [!TIP] 15 | > Language: English (you can choose your language readme at i18n directory) 16 | 17 | A mod that override the vanilla soundtrack into Blue Archive Soundtrack, and also adds the cosmetics for units such as halo. This mod is unaffiliated with developer of Blue Archive game: Nexon, NAT GAMES and Yostar. 18 | 19 | ## Music List 20 | - menu.ogg = Constant Moderato & RE Aoharu (You can set it at setting) 21 | - launch.ogg = ~~Connected Sky~~ Shooting Stars 22 | - game1.ogg = Rolling Beat 23 | - game2.ogg = Acceleration 24 | - game3.ogg = KIRISAME 25 | - game4.ogg = Midnight Trip 26 | - game5.ogg = Sakura Punch 27 | - game6.ogg = Formless Dream 28 | - game7.ogg = Vivid Night 29 | - game8.ogg = Crucial Issue 30 | - game9.ogg = KARAKURhythm 31 | - editor.ogg = Mischievous Step 32 | - land.ogg = Aoharu (Intro Sampling) 33 | - boss1.ogg = ~~Tech N Tech~~ Endless Carnival 34 | - boss2.ogg = Out of Control 35 | - fine.ogg = Alkaline Tears 36 | - lose.ogg (additional) = Fade Out 37 | - win.ogg (additional) = Party Time 38 | - research.ogg (additional) = Future Lab 39 | - database.ogg (additional) = Future Bossa 40 | - loadout.ogg (additional) = MX Adventure 41 | - and more... 42 | 43 | ## Building 44 | 45 | To generate the mod jar, you can do this below with platform specified jar: 46 | - Android: `gradlew dex` 47 | - PC: `gradlew jar` 48 | 49 | for Build Deployment(desktop and android) you can do `gradlew build` 50 | 51 | ## Bleeding Edges(Snapshot) 52 | Every BE(Snapshot) builds was generated via Actions, you can check on Actions section and select the specific workflow, 53 | then download the artifact on the workflow runs 54 | 55 | ## Star History 56 | 57 | 58 | 59 | 60 | 61 | Star History Chart 62 | 63 | 64 | 65 | ## Credits 66 | - Music: Nor, Mitsukiyo and KARUT 67 | -------------------------------------------------------------------------------- /TRANSLATING.md: -------------------------------------------------------------------------------- 1 | # Translation Guidelines 2 | ## Overview 3 | This mod also supports bundles, you can make your language at this mod. 4 | Therefore, you must follow the [Mindustry Translation Guide](https://github.com/Anuken/Mindustry/blob/master/TRANSLATING.md) before you contribute for translation at this mod. 5 | 6 | For translation of this mod, I as the creator of this mod provides the file should you being translated with your language: 7 | - Bundle 8 | - README 9 | 10 | ## README 11 | for Readme translation, you can do it at i18n directory at the root of repository `/i18n`. 12 | The language source is English because the mod was firstly made in English. 13 | 14 | Note: 15 | for adding the new entry of the language, you must add this info for identification: 16 | ```markdown 17 | > ("language" in your language): (language) 18 | ``` 19 | Example case: 20 | ```markdown 21 | > Language: English 22 | ``` 23 | Ignore the Star History because for Main README statistic and milestone -------------------------------------------------------------------------------- /assets/bundles/bundle.properties: -------------------------------------------------------------------------------- 1 | setting.ba-firstTime.name = First time you installed this mod? 2 | setting.ba-firstTime.description = Misono Mika appears after you installed this mod. For stopping annoyance, you can disable that 3 | setting.ba-addHalo.name = Enable Halo for Units 4 | setting.ba-addHalo.description = Adding Halo for Units,[red] Requires to restart the game[] 5 | setting.ArisuVoiceEnable.name = Tendou Arisu as Collaris 6 | setting.HinaVoiceEnable.name = Sorasaki Hina as Toxopid 7 | setting.ArisuVoiceEnable.description = {0} 8 | ba-firstTimeDialog.description = Hi Sensei! you just installed this mod. \n Although it still in development by the creator of ArchiveDustry, [accent]WilloIzCitron[]. \nThe creator need to take a long time for making the new content in the future. Thank you! 9 | ba-firstTimeDialog.button = Ok Misono Mika. 10 | ba-firstTimeDialog.title = Thanks for using ArchiveDustry! 11 | setting.ba-youtube.name = Blue Archive Youtube Channel 12 | setting.ba-github.name = ArchiveDustry Repository 13 | setting.ba-github.description = You can support the developer with staring this mod 14 | setting.category.general-setting = < General Settings > 15 | setting.category.links = < Links > 16 | setting.category.unit-sound = < Unit Sound > 17 | setting.category.unit-sound.description = Unit Sound is used for cosmetic. If you disable all, it will not be loaded in the game 18 | setting.ba-downloadLive2D.name = Download Live2D Data 19 | setting.ba-downloadLive2D.description = Data for Recollection Lobby, you need to install for experiencing Recollection Lobby 20 | 21 | setting.setSong.name = Main Menu Music 22 | ba-music1.name = Constant Moderato 23 | ba-music2.name = RE Aoharu 24 | ba-music3.name = Recollection Lobby 25 | setting.setSong.description = Replaces the Main Menu song into:\n- Constant Moderato \n- [red][HEAVY SPOILER!!][] "Where All Miracle Begin" (RE Aoharu) \n- the Recollection Lobby (require to Enable Recollection Lobby) 26 | 27 | setting.enableL2D.name = Enable Recollection Lobby 28 | setting.setL2D.name = Recollection Lobby 29 | ba-l2d.author= by: {0} 30 | ba-caution = Caution 31 | ba-caution-text = Installing Live2D packs may require some resources to run smoothly.\nNot recommended to apply Live2D (Recollection Lobby) on 32-bit JRE/JDK.\nRequired internet connection to install packs from repo.\nIf you don't want it, you can install on Mindustry data directory and create the folder named "live2d", put the pack you installed before.\nDocumentation for your own Live2D pack available on this mod GitHub. 32 | ba-l2dInstallLocally = Install Locally 33 | ba-l2dInstallRepo = Install from Repo 34 | 35 | 36 | 37 | ba-l2dManager= Live2D Manager 38 | ba-restartDialogText= Sensei. Please restart the game to apply the change... 39 | ba-restartConfirm= OK Arona, I'll restart the game 40 | 41 | unit.collaris.details = "\*Fanfare\* Alice joined the party."\nTendou Arisu, the girl who has hijacked the Collaris' system.\nidk why?\nthere something strange? 42 | unit.toxopid.details = The Head of Perfect Team, Sorasaki Hina.\n Her team just bought a futuristic alien war machine for security and increasing the firepower of Gehenna Perfect Team Army. Or to dethrone Pandemonium Society? never mind. 43 | unit.conquer.details = Pandemonium Society brought a gigantic tank with 240mm barrel that can shoot the fountain of bullet. \nthe name of tank is Conquer with code CQR-1304, it pierce every building.\NNatsume Iroha, the girl who interested with Conquer to replace old rusty tank named Toramaru. 44 | 45 | l2dDownload = DOWNLOADING LIVE2D... 46 | l2dInstall = INSTALLING LIVE2D... 47 | l2dComplete = LIVE2D INSTALLED 48 | 49 | l2dRestartRequired = Live2D has been installed, Restart Required 50 | 51 | setting.gameOver.name = Game Over (Win & Lose) 52 | setting.research.name = Research 53 | setting.coreDatabase.name = Core Database 54 | setting.loadout.name = Schematic Loadout 55 | setting.category.mixer = < Audio Mixer (Additional Soundtrack) > 56 | 57 | # TOOL TIP ATLAS 58 | 59 | tooltipTitle-0 = Keep out from Installing Mods 60 | tooltipInfo-0 = Be careful from installing mods, It would being dangerous if you install from untrusted sources.\nAlso seek mod source code from GitHub! 61 | tooltipTitle-1 = Welcome to Mindustry 62 | tooltipInfo-1 = Oh, the new Shardian has come.\nplease experience the tutorial before playing 63 | tooltipTitle-2 = Serpulo 64 | tooltipInfo-2 = The planet without any lifeform except the purple thing called Spore 65 | tooltipTitle-3 = Erekir 66 | tooltipInfo-3 = The hottest planet of the system.\nIn the planet, you will melted soon... 67 | tooltipTitle-4 = Don't Overdemand Your Silicon 68 | tooltipInfo-4 = Silicon supply and demand affects your gameplay.\nJust make more supply or less demand of Silicon 69 | tooltipTitle-5 = Crux 70 | tooltipInfo-5 = Faction were established on Serpulo in order to maintain their sector.\nYou must attack them to dominate the planet 71 | tooltipTitle-6 = Malis 72 | tooltipInfo-6 = In Erekir, there's the faction with advanced technology than Crux.\nBe careful from them! 73 | tooltipTitle-7 = Neoplasia 74 | tooltipInfo-7 = Dangerous substance that eradicate your base with infestation, keep away from your core! 75 | 76 | sussy = Collaris was possessed by Key, you can't disable/enable that unit sound anyway. it won't work :) 77 | 78 | unit.crawler-legged.name = Crawler (Legged) 79 | unit.crawler-legged.description = Runs toward enemies and self-destructs, causing a large explosion. -------------------------------------------------------------------------------- /assets/bundles/bundle_id_ID.properties: -------------------------------------------------------------------------------- 1 | setting.ba-firstTime.name = Pertama kali kamu telah menginstall mod ini? 2 | setting.ba-firstTime.description = Misono Mika akan muncul setelah menginstall mod ini. Untuk menghentikan gangguan, kamu dapat mematikannya 3 | setting.ba-addHalo.name = Nyalakan Halo untuk Unit 4 | setting.ba-addHalo.description = Menambahkan Halo untuk Unit,[red] Diperlukan untuk mulai ulang permainanmu [] 5 | setting.ArisuVoiceEnable = Tendou Arisu sebagai Collaris 6 | setting.HinaVoiceEnable = Sorasaki Hina sebagai Toxopid 7 | setting.ArisuVoiceEnavle.description = {0} 8 | ba-firstTimeDialog.description = Hi Sensei! Kamu telah menginstall mod ini. \n Walaupun, itu masih dalam pengembangan oleh pencipta ArchiveDustry, [accent]WilloIzCitron[]. \nPencipta membutuhkan banyak waktu untuk mengerjakan konten baru kedepannya nanti. Terima kasih! 9 | ba-firstTimeDialog.button = Ok Misono Mika. 10 | ba-firstTimeDialog.title = Terima kasih telah menggunakan ArchiveDustry! 11 | setting.ba-github.name = Repositori ArchiveDustry 12 | setting.ba-github.description = Kamu dapat bintang mod ini untuk memberi dukungan kepada pengembang 13 | setting.category.general-setting = < Pengaturan Umum > 14 | setting.category.unit-sound = < Suara Unit > 15 | setting.category.unit-sound.description = Suara Unit digunakan untuk kosmetik. jika dimatikan semua, maka itu akan tidak dimuatkan di game 16 | setting.category.links = < Tautan > 17 | setting.ba-downloadLive2D.name = Unduh Data Live2D 18 | setting.ba-downloadLive2D.description = Data untuk Recollection Lobby, Kamu butuh menginstall untuk pengalaman Recollection Lobby 19 | 20 | setting.setSong.name = Musik Menu Utama 21 | ba-music1.name = Constant Moderato 22 | ba-music2.name = RE Aoharu 23 | ba-music3.name = Recollection Lobby 24 | setting.setSong.description = Mengubah musik menu utama ke:\n- Constant Moderato \n- [red][SPOILER BERAT!!][] "Where All Miracle Begin" (RE Aoharu) \n- Recollection Lobby (dibutuhkan untuk menyalakan Recollection Lobby) 25 | 26 | setting.enableL2D.name = Nyalakan Recollection Lobby 27 | setting.setL2D.name = Recollection Lobby 28 | ba-l2d.author= dari: {0} 29 | ba-caution = Peringatan 30 | ba-caution-text = Mengunduh paket Live2D membutuhkan beberapa sumber daya untuk berjalan lancar.\nTidak direkomendasikan untuk mengaplikasikan Live2D (Recollection Lobby) di JRE/JDK 32-bit.\nMembutuhkan koneksi internet untuk menginstal paket dari Repo.\nJika kamu tidak mau, kamu bisa instal di direktori data Mindustry dan buat folder bernama "live2d", letakan paket zipmu yang kau instal dari Repo.\nDokumentasi untuk paket Live2Dmu sendiri tersedia di GitHub mod ini. 31 | ba-l2dInstallLocally = Unduh secara Lokal 32 | ba-l2dInstallRepo = Unduh dari Repo 33 | 34 | ba-l2dManager= Manajer Live2D 35 | ba-restartDialogText= Sensei. Mohon jalankan ulang permainan mu untuk menerapkan perubahan... 36 | ba-restartConfirm= OK Arona, Saya akan menjalankan ulang gamenya 37 | 38 | unit.collaris.details = "\*Panpakapan!\* Alice telah bergabung dalam timmu."\nTendou Arisu, gadis yang telah mengambil alih sistem Collaris.\nSaya tidak tahu kenapa?\nAda sesuatu yang aneh?? 39 | unit.toxopid.details = Ketua Perfect Team, Sorasaki Hina.\n Tim dia telah membeli mesin tempur alien yang futuristik untuk keamanan dan meningkatkan serangan untuk Gehenna Perfect Team. Atau untuk melengserkan Pandemonium Society? entahlah. 40 | unit.conquer.details = Pandemonium Society telah membeli sebuah tank raksasa dengan barel 240mm yang dapat menembakan pancuran peluru. \n nama tank ini adalah Conquer dengan kode CQR-1304, itu menembus seluruh bangunan.\nNatsume Iroha, gadis yang tertarik dengan Conquer untuk mengganti tank tua berkaratnya yang bernama Toramaru. 41 | 42 | l2dDownload = MENGUNDUH LIVE2D... 43 | l2dInstall = MEMASANG LIVE2D... 44 | l2dComplete = LIVE2D TERPASANG 45 | 46 | l2dRestartRequired = Live2D telah dipasangkan, Memulai ulang diperlukan 47 | 48 | setting.gameOver.name = Permainan Berakhir (Menang & Kalah) 49 | setting.research.name = Penelitian 50 | setting.coreDatabase.name = Database Inti 51 | setting.loadout.name = Schematic Loadout 52 | setting.category.mixer = < Audio Mixer (Soundtrack Tambahan) > 53 | 54 | # TOOL TIP ATLAS. William, translate pls 55 | 56 | tooltipTitle-0 = Berhati-hatilah untuk menginstall mod 57 | tooltipInfo-0 = Berhati-hatilah untuk menginstall mod, Itu akan berbahanya jika anda menginstall dari sumber yang tidak dipercaya.\nJuga liat kode sumber di GitHub! 58 | tooltipTitle-1 = Selamat Datang di Mindustry 59 | tooltipInfo-1 = Oh, Shardian baru telah datang.\nMohon menguasai tutorial dulu 60 | tooltipTitle-2 = Serpulo 61 | tooltipInfo-2 = Planet yang tidak ada kehidupan manapun kecuali benda ungu yang disebut spora 62 | tooltipTitle-3 = Erekir 63 | tooltipInfo-3 = Planet terpanas dari sistem tata surya.\nDi planet ini, Kau akan segera meleleh... 64 | tooltipTitle-4 = Jangan kelebihan permintaan Silikon 65 | tooltipInfo-4 = Permintaan dan penawaran dari silikon berpengaruh dalam game.\nBuat banyak penawaran/persediaan dan kurangi permintaan/penggunaan dari silikon saja 66 | tooltipTitle-5 = Crux 67 | tooltipInfo-5 = Fraksi yang dimana didirikan di Serpulo untuk menjaga sektornya.\nKau diharuskan melawan untuk menguasai planet ini 68 | tooltipTitle-6 = Malis 69 | tooltipInfo-6 = Di Erekir, Ada fraksi yang memiliki teknologi lebih canggih daripada Crux.\nBerhati-hatilah dengan Mereka! 70 | tooltipTitle-7 = Neoplasia 71 | tooltipInfo-7 = Substansi berbahaya yang dapat menghancurkan markasmu dengan infestasi, Berjauhilah dari coremu! 72 | 73 | sussy = Collaris telah dirasuki oleh Key, Lu gak bisa matiin/nyalain suara unit itu. gak bakalan bekerja :) 74 | unit.crawler-legged.name = Crawler (Berkaki) 75 | unit.crawler-legged.description = Berlari menuju musuh dan menghancurkan dirinya, yang dapat menghasilkan ledakan besar. -------------------------------------------------------------------------------- /assets/bundles/bundle_it.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/bundles/bundle_it.properties -------------------------------------------------------------------------------- /assets/bundles/bundle_ru_RU.properties: -------------------------------------------------------------------------------- 1 | setting.ba-firstTime.name = Это первый раз когда вы устанавливаете этот мод? 2 | setting.ba-firstTime.description = Мисоно Мика появляется после установки этого мода. Чтобы остановить это надоедание, можете выключить это 3 | setting.ba-addHalo.name = Включить Гало Юнитам 4 | setting.ba-addHalo.description = Добавление Гало Юнитам,[red] Требуется Перезапуск [] 5 | ba-firstTimeDialog.description = Привет Сенсей! Ты только что установил этот мод. \n Хотя он все ещё в разработке создателем ArchiveDustry, [accent]WilloIzCitron[]. \n Создателю нужно много времени чтобы делать новый контент в будущем. Спасибо! 6 | ba-firstTimeDialog.button = Хорошо, Мисоно Мика. 7 | ba-firstTimeDialog.title = Спасибо за использование ArchiveDustry! 8 | setting.ba-youtube.name = YouTube канал Blue Archive 9 | setting.ba-github.name = Репозиторий ArchiveDustry 10 | setting.ba-github.description = Вы можете поддержать разработчика поставив звёздочку этому моду 11 | setting.category.general-setting = < Основные Настройки > 12 | setting.category.links = < Ссылки > 13 | setting.ba-downloadLive2D.name = Скачать Live2D Данные 14 | setting.ba-downloadLive2D.description = Данные для Лобби Воспоминаний, вам нужно установить их чтобы воспользоваться Лобби 15 | 16 | setting.setSong.name = Музыка Главного Меню 17 | ba-music1.name = Constant Moderato 18 | ba-music2.name = RE Aoharu 19 | ba-music3.name = Recollection Lobby 20 | setting.setSong.description = Заменяет музыку главного меню музыкой:\n- Constant Moderato \n- [red][ОГРОМНЫЕ СПОЙЛЕРЫ!!][] "Where All Miracle Begin" (RE Aoharu) \n- Лобби Воспоминаний (нужно включить Лобби Воспоминаний) 21 | 22 | setting.enableL2D.name = Включить Лобби Воспоминаний 23 | setting.setL2D.name = Лобби Воспоминаний 24 | ba-l2d.author= by: {0} 25 | 26 | ba-l2dManager= Live2D Manager 27 | ba-restartDialogText= Сенсей. Пожалуйста перезапустите игру чтобы изменения применились... 28 | ba-restartConfirm= Хорошо Арона, я перезапущу. 29 | unsupported32Bit = Лобби Воспоминаний не поддерживалось 32х-битной Java Runtime Environment, пожалуйста используйте 64х-битную Java Runtime Environment или обновите ваш девайс. 30 | 31 | 32 | unit.collaris.details = "\*Фанфары\* Алиса присоединилась к пати."\nТендоу Арису, девочка которая взломала систему Коллариса.\nНе знаю, почему?\nТам что-то странное? 33 | unit.toxopid.details = Глава Идеальной Команды, Соразаки Хина.\n Ее команда только что купила футуристическую боевую машину пришельцев для обеспечения безопасности и увеличения огневой мощи Гехенна Идеальная Команда Армии. 34 | unit.conquer.details = Общество Пандемониум представило гигантский танк с 240мм стволом, который может выпускать фонтаны пуль. \nИмя танка Конквеер с кодом CQR-1304, он простреливает любую постройку.\N Нацуме Ироха, девушка которая заинтересовалась Конквеером и решила заменить старый танк Торамару. 35 | 36 | l2dDownload = DOWNLOADING LIVE2D... 37 | l2dInstall = INSTALLING LIVE2D... 38 | l2dComplete = LIVE2D INSTALLED 39 | 40 | setting.gameOver.name = Конец Игры (Победа & Поражение) 41 | setting.research.name = Исследование 42 | setting.coreDatabase.name = База Данных Ядра 43 | setting.loadout.name = Загрузка Схем 44 | setting.category.mixer = < Аудио Миксер (Дополнительный Саундтрек) > 45 | 46 | # TOOL TIP ATLAS 47 | 48 | tooltipTitle-0 = Воздержитесь от установки модов 49 | tooltipInfo-0 = Будьте осторожны со скачиванием модв, это может быть опасно в случае скачивания из непроверенных источников.\nТакже ищите исходный код мода на GitHub-е! 50 | tooltipTitle-1 = Добро пожаловать в Mindustry 51 | tooltipInfo-1 = О, новый Осколочный пришел.\nПожалуйста пройдите обучение до начала игры 52 | tooltipTitle-2 = Серпуло 53 | tooltipInfo-2 = Планета без каких-либо форм жизни, кроме фиолетовой штуки которую называют спорами 54 | tooltipTitle-3 = Эрекир 55 | tooltipInfo-3 = Самая горячая планета системы.\nВнутри планеты вы быстро расплавитесь... 56 | tooltipTitle-4 = Не перестарайтесь с кремнием 57 | tooltipInfo-4 = Производство и потребление кремния влияет на игру.\nПросто сделайте больше производство, или меньше потребление 58 | tooltipTitle-5 = Крюксы 59 | tooltipInfo-5 = Каждая фракция на Серпуло создана для того чтобы защищать свой сектор.\nВы должны победить их для контроля над планетой 60 | tooltipTitle-6 = Малис 61 | tooltipInfo-6 = На Эрекире есть фрация с более продвинутыми технологиями чем у Крюксов.\nБудьте осторожны с ними! 62 | tooltipTitle-7 = Неоплазма 63 | tooltipInfo-7 = Опасное вещество которое распространяет убийственное заражение, держите подальше от ядра! 64 | -------------------------------------------------------------------------------- /assets/bundles/bundle_zh_CN.properties: -------------------------------------------------------------------------------- 1 | setting.ba-firstTime.name = 这是您第一次安装此模组吗? 2 | setting.ba-firstTime.description = 安装模组后会出现圣园•未花的提示。若需禁用此功能可在此处关闭 3 | setting.ba-addHalo.name = 为角色启用光环效果 4 | setting.ba-addHalo.description = 为所有单位添加光环效果,[red]需要重启游戏生效[] 5 | setting.ArisuVoiceEnable.name = 天童•爱丽丝(声音会在天帝上播放) 6 | setting.HinaVoiceEnable.name = 空崎•日奈(声音会在天蝎上播放) 7 | setting.ArisuVoiceEnable.description = {0} 8 | 9 | ba-firstTimeDialog.description = 嗨,Sensei!您已成功安装本模组。\n虽然当前仍处于开发阶段(由ArchiveDustry作者[accent]WilloIzCitron[]制作),\n未来需要较长时间开发新内容。感谢您的支持! 10 | ba-firstTimeDialog.button = 明白了,圣园•未花 11 | ba-firstTimeDialog.title = 感谢游玩ArchiveDustry模组! 12 | 13 | setting.ba-youtube.name = 蔚蓝档案官方YouTube频道 14 | setting.ba-github.name = ArchiveDustry代码仓库 15 | setting.ba-github.description = 您可以通过给仓库点Star支持开发者 16 | 17 | setting.category.general-setting = < 常规设置 > 18 | setting.category.links = < 相关链接 > 19 | setting.category.unit-sound = < 角色语音 > 20 | setting.category.unit-sound.description = 角色语音仅用于装饰性功能。若全部禁用则不会加载到游戏中 21 | 22 | setting.ba-downloadLive2D.name = 下载Live2D数据 23 | setting.ba-downloadLive2D.description = 记忆大厅所需数据,需安装后才能体验此功能 24 | 25 | setting.setSong.name = 主界面音乐 26 | ba-music1.name = Constant Moderato 27 | ba-music2.name = RE Aoharu 28 | ba-music3.name = 记忆大厅 29 | setting.setSong.description = 将主界面音乐替换为:\n- Constant Moderato\n- [red][重大剧透警告!!!][] “奇迹起始之地”(RE Aoharu)\n- 记忆大厅(需启用记忆大厅功能) 30 | 31 | setting.enableL2D.name = 启用记忆大厅 32 | setting.setL2D.name = 记忆大厅模式 33 | ba-l2d.author= 作者:{0} 34 | 35 | ba-caution = 注意事项 36 | ba-caution-text = 安装Live2D资源包可能需要较高配置才能流畅运行。不建议在32位JRE/JDK环境下使用Live2D(记忆大厅)功能。\n需要网络连接以下载资源库中的资源包。若需本地安装,请在Mindustry数据目录创建“live2d”文件夹并放置资源包。\n自定义Live2D资源包指南请参阅模组GitHub文档。 37 | 38 | ba-l2dInstallLocally = 本地安装 39 | ba-l2dInstallRepo = 从资源库安装 40 | 41 | ba-l2dManager= Live2D管理器 42 | ba-restartDialogText= Sensei,请重启游戏以应用更改! 43 | ba-restartConfirm= 明白了,阿洛娜。我会重启游戏 44 | 45 | unit.天帝.details = “*号角声* 爱丽丝加入了队伍。”\n天童•爱丽丝,成功骇入天帝系统的少女。\n原因未知?\n似乎有些可疑之处? 46 | unit.toxopid.details = 完美战队队长空崎•日奈。\n她的团队购置了外星科技战争机器来强化格黑娜战力——或是为了推翻潘德米拉姆议会?谁知道呢。 47 | unit.conquer.details = 潘德米拉姆议会带来了配备240mm巨炮的征服者坦克,\n代号CQR-1304,其弹幕可贯穿一切建筑。\n对此感兴趣的夏莱对策委员枣•伊吕波,正计划用它取代老旧的“虎丸”坦克。 48 | 49 | l2dDownload = 正在下载Live2D 50 | l2dInstall = 正在安装Live2D 51 | l2dComplete = Live2D安装完成 52 | l2dRestartRequired = Live2D已安装,需要重启游戏 53 | 54 | setting.gameOver.name = 游戏结束(胜利/失败) 55 | setting.research.name = 科技树 56 | setting.coreDatabase.name = 核心数据库 57 | setting.loadout.name = 蓝图目录 58 | setting.category.mixer = 音频混合器(附加音轨) 59 | 60 | tooltipTitle-0 = 模组安装警告 61 | tooltipInfo-0 = 模组安装警告:安装模组需谨慎,来自不可信来源的模组可能造成危险。建议通过GitHub核查模组源代码! 62 | tooltipTitle-1 = 欢迎来到Mindustry 63 | tooltipInfo-1 = 欢迎来到Mindustry\n新的夏莱成员到来啦!开始游戏前请先体验教程哦 64 | tooltipTitle-2 = 赛普罗 65 | tooltipInfo-2 = 赛普罗:这颗星球上除了被称为孢子的紫色生物外,别无其他生命形式 66 | tooltipTitle-3 = 埃里克尔 67 | tooltipInfo-3 = 埃里克尔:星系中最炽热的行星,在这里你很快就会融化 68 | tooltipTitle-4 = 合理规划硅需求 69 | tooltipInfo-4 = 合理规划硅需求\n硅的供需平衡影响游戏进程,请确保供给充足或减少需求 70 | tooltipTitle-5 = Crux(红队) 71 | tooltipInfo-5 = Crux(红队)\n为控制赛普罗星区而建立的阵营,必须击败他们才能统治行星 72 | tooltipTitle-6 = Malis(紫队) 73 | tooltipInfo-6 = Malis(紫队)\n埃里克尔上比Crux(红队)更先进的阵营,千万要小心应对! 74 | tooltipTitle-7 = 瘤液 75 | tooltipInfo-7 = 瘤液:会通过侵蚀含水建筑摧毁基地的危险物质,务必远离核心区域! 76 | 77 | sussy = 天帝已被Key控制,你无法禁用/启用该单位语音。这不会生效的 :) 78 | 79 | unit.crawler-legged.name = 爬虫(足式) 80 | unit.crawler-legged.description = 爬虫(足式):冲向敌人并自爆造成大范围爆炸。保留原始爆炸机制。 -------------------------------------------------------------------------------- /assets/bundles/bundle_zh_TW.properties: -------------------------------------------------------------------------------- 1 | setting.ba-firstTime.name = 這是您第一次安裝此模組嗎? 2 | setting.ba-firstTime.description = 安裝模組後會出現聖園•未花的提示。若需停用此功能可在此處關閉 3 | setting.ba-addHalo.name = 為角色啟用光環效果 4 | setting.ba-addHalo.description = 為所有單位添加光環效果,[red]需要重新啟動遊戲生效[] 5 | setting.ArisuVoiceEnable.name = 天童•愛麗絲(聲音會在天帝上播放) 6 | setting.HinaVoiceEnable.name = 空崎•日奈(聲音會在天蝎上播放) 7 | setting.ArisuVoiceEnable.description = {0} 8 | 9 | ba-firstTimeDialog.description = 嗨,Sensei!您已成功安裝本模組。\n雖然當前仍處於開發階段(由ArchiveDustry作者[accent]WilloIzCitron[]製作),\n未來需要較長時間開發新內容。感謝您的支持! 10 | ba-firstTimeDialog.button = 明白了,聖園•未花 11 | ba-firstTimeDialog.title = 感謝遊玩ArchiveDustry模組! 12 | 13 | setting.ba-youtube.name = 蔚藍檔案官方YouTube頻道 14 | setting.ba-github.name = ArchiveDustry程式碼倉庫 15 | setting.ba-github.description = 您可以透過給倉庫點Star支持開發者 16 | 17 | setting.category.general-setting = < 常規設定 > 18 | setting.category.links = < 相關連結 > 19 | setting.category.unit-sound = < 角色語音 > 20 | setting.category.unit-sound.description = 角色語音僅用於裝飾性功能。若全部停用則不會載入到遊戲中 21 | 22 | setting.ba-downloadLive2D.name = 下載Live2D資料 23 | setting.ba-downloadLive2D.description = 記憶大廳所需資料,需安裝後才能體驗此功能 24 | 25 | setting.setSong.name = 主介面音樂 26 | ba-music1.name = Constant Moderato 27 | ba-music2.name = RE Aoharu 28 | ba-music3.name = 記憶大廳 29 | setting.setSong.description = 將主介面音樂替換為:\n- Constant Moderato\n- [red][重大劇透警告!!!][] 「奇蹟起始之地」(RE Aoharu)\n- 記憶大廳(需啟用記憶大廳功能) 30 | 31 | setting.enableL2D.name = 啟用記憶大廳 32 | setting.setL2D.name = 記憶大廳模式 33 | ba-l2d.author= 作者:{0} 34 | 35 | ba-caution = 注意事項 36 | ba-caution-text = 安裝Live2D資源包可能需要較高配置才能流暢運行。\n不建議在32位JRE/JDK環境下使用Live2D(記憶大廳)功能。\n需要網路連接以下載資源庫中的資源包。\n若需本地安裝,請在Mindustry數據目錄創建"live2d"資料夾並放置資源包。\n自訂Live2D資源包指南請參閱模組GitHub文檔。 37 | 38 | ba-l2dInstallLocally = 本機安裝 39 | ba-l2dInstallRepo = 從資源庫安裝 40 | 41 | ba-l2dManager= Live2D管理器 42 | ba-restartDialogText= Sensei,請重新啟動遊戲以套用變更! 43 | ba-restartConfirm= 明白了,阿洛娜。我會重新啟動遊戲 44 | 45 | unit.天帝.details = 「*號角聲* 愛麗絲加入了隊伍。」\n天童•愛麗絲,成功駭入天帝系統的少女。\n原因未知?\n似乎有些可疑之處? 46 | unit.toxopid.details = 完美戰隊隊長空崎•日奈。\n她的團隊購置了外星科技戰爭機器來強化格黑娜戰力——或是為了推翻潘德米拉姆議會?誰知道呢。 47 | unit.conquer.details = 潘德米拉姆議會帶來了配備240mm巨炮的征服者坦克,\n代號CQR-1304,其彈幕可貫穿一切建築。\n對此感興趣的夏萊對策委員棗•伊呂波,正計劃用它取代老舊的「虎丸」坦克。 48 | 49 | l2dDownload = 正在下載Live2D 50 | l2dInstall = 正在安裝Live2D 51 | l2dComplete = Live2D安裝完成 52 | l2dRestartRequired = Live2D已安裝,需要重新啟動遊戲 53 | 54 | setting.gameOver.name = 遊戲結束(勝利/失敗) 55 | setting.research.name = 科技樹 56 | setting.coreDatabase.name = 核心資料庫 57 | setting.loadout.name = 藍圖目錄 58 | setting.category.mixer = 音訊混音器(附加音軌) 59 | 60 | tooltipTitle-0 = 模組安裝警告 61 | tooltipInfo-0 = 模組安裝警告:安裝模組需謹慎,來自不可信來源的模組可能造成危險。建議透過GitHub核查模組原始碼! 62 | tooltipTitle-1 = 歡迎來到Mindustry 63 | tooltipInfo-1 = 歡迎來到Mindustry\n新的夏萊成員到來啦!開始遊戲前請先體驗教學哦 64 | tooltipTitle-2 = 賽普羅 65 | tooltipInfo-2 = 賽普羅:這顆星球上除了被稱為孢子的紫色生物外,別無其他生命形式 66 | tooltipTitle-3 = 埃里克爾 67 | tooltipInfo-3 = 埃里克爾:星系中最熾熱的行星,在這裡你很快就會融化 68 | tooltipTitle-4 = 合理規劃矽需求 69 | tooltipInfo-4 = 合理規劃矽需求\n矽的供需平衡影響遊戲進程,請確保供給充足或減少需求 70 | tooltipTitle-5 = Crux(紅隊) 71 | tooltipInfo-5 = Crux(紅隊)\n為控制賽普羅星區而建立的陣營,必須擊敗他們才能統治行星 72 | tooltipTitle-6 = Malis(紫隊) 73 | tooltipInfo-6 = Malis(紫隊)\n埃里克爾上比Crux(紅隊)更先進的陣營,千萬要小心應對! 74 | tooltipTitle-7 = 瘤液 75 | tooltipInfo-7 = 瘤液:會透過侵蝕含水建築摧毀基地的危險物質,務必遠離核心區域! 76 | 77 | sussy = 天帝已被Key控制,你無法停用/啟用該單位語音。這不會生效的 :) 78 | 79 | unit.crawler-legged.name = 爬蟲(足式) 80 | unit.crawler-legged.description = 爬蟲(足式):衝向敵人並自爆造成大範圍爆炸。保留原始爆炸機制。 -------------------------------------------------------------------------------- /assets/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/icon.png -------------------------------------------------------------------------------- /assets/music/amplify.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/amplify.ogg -------------------------------------------------------------------------------- /assets/music/aspiration.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/aspiration.ogg -------------------------------------------------------------------------------- /assets/music/boss1.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/boss1.ogg -------------------------------------------------------------------------------- /assets/music/boss2.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/boss2.ogg -------------------------------------------------------------------------------- /assets/music/boss3.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/boss3.ogg -------------------------------------------------------------------------------- /assets/music/boss4.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/boss4.ogg -------------------------------------------------------------------------------- /assets/music/bunny.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/bunny.ogg -------------------------------------------------------------------------------- /assets/music/cat.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/cat.ogg -------------------------------------------------------------------------------- /assets/music/database.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/database.ogg -------------------------------------------------------------------------------- /assets/music/dawn.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/dawn.ogg -------------------------------------------------------------------------------- /assets/music/donpolo.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/donpolo.ogg -------------------------------------------------------------------------------- /assets/music/dreamer.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/dreamer.ogg -------------------------------------------------------------------------------- /assets/music/editor.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/editor.ogg -------------------------------------------------------------------------------- /assets/music/fine.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/fine.ogg -------------------------------------------------------------------------------- /assets/music/game1.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/game1.ogg -------------------------------------------------------------------------------- /assets/music/game10.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/game10.ogg -------------------------------------------------------------------------------- /assets/music/game11.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/game11.ogg -------------------------------------------------------------------------------- /assets/music/game2.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/game2.ogg -------------------------------------------------------------------------------- /assets/music/game3.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/game3.ogg -------------------------------------------------------------------------------- /assets/music/game4.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/game4.ogg -------------------------------------------------------------------------------- /assets/music/game5.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/game5.ogg -------------------------------------------------------------------------------- /assets/music/game6.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/game6.ogg -------------------------------------------------------------------------------- /assets/music/game7.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/game7.ogg -------------------------------------------------------------------------------- /assets/music/game8.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/game8.ogg -------------------------------------------------------------------------------- /assets/music/game9.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/game9.ogg -------------------------------------------------------------------------------- /assets/music/hare.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/hare.ogg -------------------------------------------------------------------------------- /assets/music/honey.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/honey.ogg -------------------------------------------------------------------------------- /assets/music/land.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/land.ogg -------------------------------------------------------------------------------- /assets/music/launch.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/launch.ogg -------------------------------------------------------------------------------- /assets/music/loadout.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/loadout.ogg -------------------------------------------------------------------------------- /assets/music/lose.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/lose.ogg -------------------------------------------------------------------------------- /assets/music/menuaira.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/menuaira.ogg -------------------------------------------------------------------------------- /assets/music/menucm.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/menucm.ogg -------------------------------------------------------------------------------- /assets/music/menuhoi4.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/menuhoi4.ogg -------------------------------------------------------------------------------- /assets/music/menurcl.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/menurcl.ogg -------------------------------------------------------------------------------- /assets/music/menure-aoh.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/menure-aoh.ogg -------------------------------------------------------------------------------- /assets/music/moment.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/moment.ogg -------------------------------------------------------------------------------- /assets/music/oriental.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/oriental.ogg -------------------------------------------------------------------------------- /assets/music/research.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/research.ogg -------------------------------------------------------------------------------- /assets/music/somedaySometime.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/somedaySometime.ogg -------------------------------------------------------------------------------- /assets/music/t171.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/t171.ogg -------------------------------------------------------------------------------- /assets/music/theme220.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/theme220.ogg -------------------------------------------------------------------------------- /assets/music/theme228.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/theme228.ogg -------------------------------------------------------------------------------- /assets/music/wave1.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/wave1.ogg -------------------------------------------------------------------------------- /assets/music/wave2.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/wave2.ogg -------------------------------------------------------------------------------- /assets/music/wave3.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/wave3.ogg -------------------------------------------------------------------------------- /assets/music/wave4.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/wave4.ogg -------------------------------------------------------------------------------- /assets/music/win.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/music/win.ogg -------------------------------------------------------------------------------- /assets/sounds/queBom.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sounds/queBom.mp3 -------------------------------------------------------------------------------- /assets/sounds/ui/back.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sounds/ui/back.ogg -------------------------------------------------------------------------------- /assets/sounds/ui/chatMessage.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sounds/ui/chatMessage.ogg -------------------------------------------------------------------------------- /assets/sounds/ui/press.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sounds/ui/press.ogg -------------------------------------------------------------------------------- /assets/sounds/ui/unlock.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sounds/ui/unlock.ogg -------------------------------------------------------------------------------- /assets/sounds/units/collaris-arrival1.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sounds/units/collaris-arrival1.ogg -------------------------------------------------------------------------------- /assets/sounds/units/collaris-arrival2.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sounds/units/collaris-arrival2.ogg -------------------------------------------------------------------------------- /assets/sounds/units/collaris-attack1.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sounds/units/collaris-attack1.ogg -------------------------------------------------------------------------------- /assets/sounds/units/collaris-attack2.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sounds/units/collaris-attack2.ogg -------------------------------------------------------------------------------- /assets/sounds/units/collaris-attack3.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sounds/units/collaris-attack3.ogg -------------------------------------------------------------------------------- /assets/sounds/units/collaris-death.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sounds/units/collaris-death.ogg -------------------------------------------------------------------------------- /assets/sounds/units/collaris-hit1.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sounds/units/collaris-hit1.ogg -------------------------------------------------------------------------------- /assets/sounds/units/collaris-hit2.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sounds/units/collaris-hit2.ogg -------------------------------------------------------------------------------- /assets/sounds/units/collaris-hit3.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sounds/units/collaris-hit3.ogg -------------------------------------------------------------------------------- /assets/sounds/units/collaris-pickup.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sounds/units/collaris-pickup.ogg -------------------------------------------------------------------------------- /assets/sounds/units/toxopid-arrival1.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sounds/units/toxopid-arrival1.ogg -------------------------------------------------------------------------------- /assets/sounds/units/toxopid-arrival2.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sounds/units/toxopid-arrival2.ogg -------------------------------------------------------------------------------- /assets/sounds/units/toxopid-artillery.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sounds/units/toxopid-artillery.ogg -------------------------------------------------------------------------------- /assets/sounds/units/toxopid-attack1.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sounds/units/toxopid-attack1.ogg -------------------------------------------------------------------------------- /assets/sounds/units/toxopid-attack2.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sounds/units/toxopid-attack2.ogg -------------------------------------------------------------------------------- /assets/sounds/units/toxopid-attack3.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sounds/units/toxopid-attack3.ogg -------------------------------------------------------------------------------- /assets/sounds/units/toxopid-death.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sounds/units/toxopid-death.ogg -------------------------------------------------------------------------------- /assets/sounds/units/toxopid-hit1.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sounds/units/toxopid-hit1.ogg -------------------------------------------------------------------------------- /assets/sounds/units/toxopid-hit2.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sounds/units/toxopid-hit2.ogg -------------------------------------------------------------------------------- /assets/sounds/units/toxopid-hit3.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sounds/units/toxopid-hit3.ogg -------------------------------------------------------------------------------- /assets/sounds/units/toxopid-pickup.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sounds/units/toxopid-pickup.ogg -------------------------------------------------------------------------------- /assets/sprites-override/effect/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sprites-override/effect/error.png -------------------------------------------------------------------------------- /assets/sprites-override/ui/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sprites-override/ui/logo.png -------------------------------------------------------------------------------- /assets/sprites/arona-happy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sprites/arona-happy.png -------------------------------------------------------------------------------- /assets/sprites/creditpart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sprites/creditpart.png -------------------------------------------------------------------------------- /assets/sprites/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sprites/logo.png -------------------------------------------------------------------------------- /assets/sprites/mikalove.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sprites/mikalove.png -------------------------------------------------------------------------------- /assets/sprites/nekoui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sprites/nekoui.png -------------------------------------------------------------------------------- /assets/sprites/units/collaris-halo-heat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sprites/units/collaris-halo-heat.png -------------------------------------------------------------------------------- /assets/sprites/units/collaris-halo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sprites/units/collaris-halo.png -------------------------------------------------------------------------------- /assets/sprites/units/tecta-halo-heat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sprites/units/tecta-halo-heat.png -------------------------------------------------------------------------------- /assets/sprites/units/tecta-halo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/assets/sprites/units/tecta-halo.png -------------------------------------------------------------------------------- /assets/text/messages.txt: -------------------------------------------------------------------------------- 1 | Lorem Ipsum Dolor Sit Amet 2 | Ajitani Hifumi 3 | You Should Try Exoprosopa! 4 | Pls gib star... 5 | idk man why i made this? 6 | Kazakhstan threaten us with bombing 7 | testasdf 8 | Archangel vs Nucleoid battle 9 | Eden Treaty Sanitized Copy 10 | Shiroko still finding a nearest bank 11 | Bro, how much Nonomi's credit balance? 12 | for sure why Yuuka so heavy bro? 13 | Miyu hiding place: Trashcan 14 | Foreclosure Task Force 15 | Yume :skull: 16 | How do I detonate Mutsuki's bag of bomb? -------------------------------------------------------------------------------- /build.gradle.kts: -------------------------------------------------------------------------------- 1 | import arc.files.* 2 | import arc.util.* 3 | import arc.util.serialization.* 4 | import ent.* 5 | import java.io.* 6 | 7 | buildscript{ 8 | val arcVersion: String by project 9 | val useJitpack = property("mindustryBE").toString().toBooleanStrict() 10 | 11 | dependencies{ 12 | classpath("com.github.Anuken.Arc:arc-core:$arcVersion") 13 | } 14 | 15 | repositories{ 16 | if(!useJitpack) maven("https://raw.githubusercontent.com/Zelaux/MindustryRepo/master/repository") 17 | maven("https://jitpack.io") 18 | } 19 | } 20 | 21 | plugins{ 22 | java 23 | id("com.github.GlennFolker.EntityAnno") apply false 24 | } 25 | 26 | val arcVersion: String by project 27 | val mindustryVersion: String by project 28 | val mindustryBEVersion: String by project 29 | val entVersion: String by project 30 | 31 | val modName: String by project 32 | val modArtifact: String by project 33 | val modFetch: String by project 34 | val modGenSrc: String by project 35 | val modGen: String by project 36 | 37 | val androidSdkVersion: String by project 38 | val androidBuildVersion: String by project 39 | val androidMinVersion: String by project 40 | 41 | val useJitpack = property("mindustryBE").toString().toBooleanStrict() 42 | 43 | fun arc(module: String): String{ 44 | return "com.github.Anuken.Arc$module:$arcVersion" 45 | } 46 | 47 | fun mindustry(module: String): String{ 48 | return "com.github.Anuken.Mindustry$module:$mindustryVersion" 49 | } 50 | 51 | fun entity(module: String): String{ 52 | return "com.github.GlennFolker.EntityAnno$module:$entVersion" 53 | } 54 | 55 | allprojects{ 56 | apply(plugin = "java") 57 | sourceSets["main"].java.setSrcDirs(listOf(layout.projectDirectory.dir("src"))) 58 | 59 | configurations.configureEach{ 60 | // Resolve the correct Mindustry dependency, and force Arc version. 61 | resolutionStrategy.eachDependency{ 62 | if(useJitpack && requested.group == "com.github.Anuken.Mindustry"){ 63 | useTarget("com.github.Anuken.MindustryJitpack:${requested.module.name}:$mindustryBEVersion") 64 | }else if(requested.group == "com.github.Anuken.Arc"){ 65 | useVersion(arcVersion) 66 | } 67 | } 68 | } 69 | 70 | dependencies{ 71 | // Downgrade Java 9+ syntax into being available in Java 8. 72 | annotationProcessor(entity(":downgrader")) 73 | } 74 | 75 | repositories{ 76 | // Necessary Maven repositories to pull dependencies from. 77 | mavenCentral() 78 | maven("https://oss.sonatype.org/content/repositories/snapshots/") 79 | maven("https://oss.sonatype.org/content/repositories/releases/") 80 | maven("https://raw.githubusercontent.com/GlennFolker/EntityAnnoMaven/main") 81 | maven("https://maven.xpdustry.com/mindustry") 82 | 83 | // Use Zelaux's non-buggy repository for release Mindustry and Arc builds. 84 | if(!useJitpack) maven("https://raw.githubusercontent.com/Zelaux/MindustryRepo/master/repository") 85 | maven("https://jitpack.io") 86 | } 87 | 88 | tasks.withType().configureEach{ 89 | // Use Java 17+ syntax, but target Java 8 bytecode version. 90 | sourceCompatibility = "17" 91 | options.apply{ 92 | release = 8 93 | compilerArgs.add("-Xlint:-options") 94 | 95 | isIncremental = true 96 | encoding = "UTF-8" 97 | } 98 | } 99 | } 100 | 101 | project(":"){ 102 | //Unintended to make units here, ArchivD-Contents may applicable. 103 | //apply(plugin = "com.github.GlennFolker.EntityAnno") 104 | // configure{ 105 | // modName = project.properties["modName"].toString() 106 | // mindustryVersion = project.properties[if(useJitpack) "mindustryBEVersion" else "mindustryVersion"].toString() 107 | // isJitpack = useJitpack 108 | // revisionDir = layout.projectDirectory.dir("revisions").asFile 109 | // fetchPackage = modFetch 110 | // genSrcPackage = modGenSrc 111 | // genPackage = modGen 112 | // } 113 | 114 | dependencies{ 115 | // Use the entity generation annotation processor. 116 | //compileOnly(entity(":entity")) 117 | //add("kapt", entity(":entity")) 118 | 119 | // Local Testing if commented 120 | compileOnly(mindustry(":core")) 121 | compileOnly(arc(":arc-core")) 122 | } 123 | 124 | val jar = tasks.named("jar"){ 125 | archiveFileName = "${modArtifact}Desktop.jar" 126 | 127 | val meta = layout.projectDirectory.file("$temporaryDir/mod.json") 128 | from( 129 | files(sourceSets["main"].output.classesDirs), 130 | files(sourceSets["main"].output.resourcesDir), 131 | configurations.runtimeClasspath.map{conf -> conf.map{if(it.isDirectory) it else zipTree(it)}}, 132 | 133 | files(layout.projectDirectory.dir("assets")), 134 | layout.projectDirectory.file("icon.png"), 135 | meta 136 | ) 137 | 138 | metaInf.from(layout.projectDirectory.file("LICENSE")) 139 | doFirst{ 140 | // Deliberately check if the mod meta is actually written in HJSON, since, well, some people actually use 141 | // it. But this is also not mentioned in the `README.md`, for the mischievous reason of driving beginners 142 | // into using JSON instead. 143 | val metaJson = layout.projectDirectory.file("mod.json") 144 | val metaHjson = layout.projectDirectory.file("mod.hjson") 145 | 146 | if(metaJson.asFile.exists() && metaHjson.asFile.exists()){ 147 | throw IllegalStateException("Ambiguous mod meta: both `mod.json` and `mod.hjson` exist.") 148 | }else if(!metaJson.asFile.exists() && !metaHjson.asFile.exists()){ 149 | throw IllegalStateException("Missing mod meta: neither `mod.json` nor `mod.hjson` exist.") 150 | } 151 | 152 | val isJson = metaJson.asFile.exists() 153 | val map = (if(isJson) metaJson else metaHjson).asFile 154 | .reader(Charsets.UTF_8) 155 | .use{Jval.read(it)} 156 | 157 | map.put("name", modName) 158 | meta.asFile.writer(Charsets.UTF_8).use{file -> BufferedWriter(file).use{map.writeTo(it, Jval.Jformat.formatted)}} 159 | } 160 | } 161 | 162 | val dex = tasks.register("dex"){ 163 | inputs.files(jar) 164 | archiveFileName = "$modArtifact.jar" 165 | 166 | val desktopJar = jar.flatMap{it.archiveFile} 167 | val dexJar = File(temporaryDir, "Dex.jar") 168 | 169 | from(zipTree(desktopJar), zipTree(dexJar)) 170 | doFirst{ 171 | logger.lifecycle("Running `d8`.") 172 | providers.exec{ 173 | // Find Android SDK root. 174 | val sdkRoot = File( 175 | OS.env("ANDROID_SDK_ROOT") ?: OS.env("ANDROID_HOME") ?: 176 | throw IllegalStateException("Neither `ANDROID_SDK_ROOT` nor `ANDROID_HOME` is set.") 177 | ) 178 | 179 | // Find `d8`. 180 | val d8 = File(sdkRoot, "build-tools/$androidBuildVersion/${if(OS.isWindows) "d8.bat" else "d8"}") 181 | if(!d8.exists()) throw IllegalStateException("Android SDK `build-tools;$androidBuildVersion` isn't installed or is corrupted") 182 | 183 | // Initialize a release build. 184 | val input = desktopJar.get().asFile 185 | val command = arrayListOf("$d8", "--release", "--min-api", androidMinVersion, "--output", "$dexJar", "$input") 186 | 187 | // Include all compile and runtime classpath. 188 | (configurations.compileClasspath.get().toList() + configurations.runtimeClasspath.get().toList()).forEach{ 189 | if(it.exists()) command.addAll(arrayOf("--classpath", it.path)) 190 | } 191 | 192 | // Include Android platform as library. 193 | val androidJar = File(sdkRoot, "platforms/android-$androidSdkVersion/android.jar") 194 | if(!androidJar.exists()) throw IllegalStateException("Android SDK `platforms;android-$androidSdkVersion` isn't installed or is corrupted") 195 | 196 | command.addAll(arrayOf("--lib", "$androidJar")) 197 | if(OS.isWindows) command.addAll(0, arrayOf("cmd", "/c").toList()) 198 | 199 | // Run `d8`. 200 | commandLine(command) 201 | }.result.get().rethrowFailure() 202 | } 203 | } 204 | 205 | tasks.register("install"){ 206 | inputs.files(jar) 207 | 208 | val desktopJar = jar.flatMap{it.archiveFile} 209 | val dexJar = dex.flatMap{it.archiveFileName} 210 | doLast{ 211 | val folder = Fi.get(OS.getAppDataDirectoryString("Mindustry")).child("mods") 212 | folder.mkdirs() 213 | 214 | val input = desktopJar.get().asFile 215 | folder.child(input.name).delete() 216 | folder.child(dexJar.get()).delete() 217 | Fi(input).copyTo(folder) 218 | 219 | logger.lifecycle("Copied :jar output to $folder.") 220 | } 221 | } 222 | } -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | ##### Project configurations. 2 | # The mod's internal name, corresponds to `name` in `mod.json`. 3 | modName = bluearchive 4 | # The mod's fetched entity sources package. 5 | modFetch = bluearchive.fetched 6 | # The mod's input entity sources package. 7 | modGenSrc = bluearchive.entities.comp 8 | # The mod's generated sources package. 9 | modGen = bluearchive.gen 10 | # The mod's JAR file name. Desktop build is suffixed with `Desktop`. 11 | modArtifact = ArchiveDustry-Java 12 | 13 | # EntityAnno version, for integrating syntax-downgrader and entity annotation processor. 14 | # The exact version you need should be looked up on the project's `README.md` 15 | # (see https://github.com/GlennFolker/EntityAnno?tab=readme-ov-file#version-compatibility). 16 | entVersion = v146.0.10 17 | # Set to `true` if the mod is compiled against Mindustry bleeding-edge build. 18 | # See documents on `mindustryVersion` and `mindustryBEVersion`. 19 | mindustryBE = false 20 | # Mindustry *release* version, e.g. `v145` or `v146`. 21 | # Leave empty if `mindustryBE = true`. 22 | mindustryVersion = v149 23 | # Mindustry *bleeding-edge* version, corresponds to commit hashes of Anuken/MindustryJitpack, e.g. `345ea0d54de0aee6953a664468556f4fea1a7c4f`. 24 | # Leave empty if `mindustryBE = false`. 25 | mindustryBEVersion = 26 | # Arc version, should either follow `mindustryVersion` for release or whatever hash bleeding-edge Mindustry uses. 27 | arcVersion = v149 28 | 29 | ##### Android SDK configuration for building Android artifacts. 30 | # Android platform SDK version. 31 | androidSdkVersion = 35 32 | # Android build-tools version. 33 | androidBuildVersion = 35.0.0 34 | # Android platform minimum API version. Should be left as 14, as that's what Mindustry officially supports. 35 | androidMinVersion = 14 36 | 37 | ##### Other stuff that should be left as-is. 38 | # Enable parallel compilation. 39 | org.gradle.parallel = true 40 | # Necessary internal API access for EntityAnno. 41 | org.gradle.jvmargs = \ 42 | -Dfile.encoding=UTF-8 \ 43 | --add-opens=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED \ 44 | --add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED \ 45 | --add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED \ 46 | --add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED \ 47 | --add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED \ 48 | --add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED \ 49 | --add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED \ 50 | --add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED \ 51 | --add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED \ 52 | --add-opens=jdk.compiler/com.sun.tools.javac.jvm=ALL-UNNAMED \ 53 | --add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED \ 54 | --add-opens=java.base/sun.reflect.annotation=ALL-UNNAMED 55 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WilloIzCitron/ArchiveDustry-Java/e6e5463daecf9b6ec44e065a8566ca91c14ae906/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-8.11.1-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # 4 | # Copyright © 2015-2021 the original 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 | # SPDX-License-Identifier: Apache-2.0 19 | # 20 | 21 | ############################################################################## 22 | # 23 | # Gradle start up script for POSIX generated by Gradle. 24 | # 25 | # Important for running: 26 | # 27 | # (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is 28 | # noncompliant, but you have some other compliant shell such as ksh or 29 | # bash, then to run this script, type that shell name before the whole 30 | # command line, like: 31 | # 32 | # ksh Gradle 33 | # 34 | # Busybox and similar reduced shells will NOT work, because this script 35 | # requires all of these POSIX shell features: 36 | # * functions; 37 | # * expansions «$var», «${var}», «${var:-default}», «${var+SET}», 38 | # «${var#prefix}», «${var%suffix}», and «$( cmd )»; 39 | # * compound commands having a testable exit status, especially «case»; 40 | # * various built-in commands including «command», «set», and «ulimit». 41 | # 42 | # Important for patching: 43 | # 44 | # (2) This script targets any POSIX shell, so it avoids extensions provided 45 | # by Bash, Ksh, etc; in particular arrays are avoided. 46 | # 47 | # The "traditional" practice of packing multiple parameters into a 48 | # space-separated string is a well documented source of bugs and security 49 | # problems, so this is (mostly) avoided, by progressively accumulating 50 | # options in "$@", and eventually passing that to Java. 51 | # 52 | # Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, 53 | # and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; 54 | # see the in-line comments for details. 55 | # 56 | # There are tweaks for specific operating systems such as AIX, CygWin, 57 | # Darwin, MinGW, and NonStop. 58 | # 59 | # (3) This script is generated from the Groovy template 60 | # https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt 61 | # within the Gradle project. 62 | # 63 | # You can find Gradle at https://github.com/gradle/gradle/. 64 | # 65 | ############################################################################## 66 | 67 | # Attempt to set APP_HOME 68 | 69 | # Resolve links: $0 may be a link 70 | app_path=$0 71 | 72 | # Need this for daisy-chained symlinks. 73 | while 74 | APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path 75 | [ -h "$app_path" ] 76 | do 77 | ls=$( ls -ld "$app_path" ) 78 | link=${ls#*' -> '} 79 | case $link in #( 80 | /*) app_path=$link ;; #( 81 | *) app_path=$APP_HOME$link ;; 82 | esac 83 | done 84 | 85 | # This is normally unused 86 | # shellcheck disable=SC2034 87 | APP_BASE_NAME=${0##*/} 88 | # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) 89 | APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s 90 | ' "$PWD" ) || exit 91 | 92 | # Use the maximum available, or set MAX_FD != -1 to use that value. 93 | MAX_FD=maximum 94 | 95 | warn () { 96 | echo "$*" 97 | } >&2 98 | 99 | die () { 100 | echo 101 | echo "$*" 102 | echo 103 | exit 1 104 | } >&2 105 | 106 | # OS specific support (must be 'true' or 'false'). 107 | cygwin=false 108 | msys=false 109 | darwin=false 110 | nonstop=false 111 | case "$( uname )" in #( 112 | CYGWIN* ) cygwin=true ;; #( 113 | Darwin* ) darwin=true ;; #( 114 | MSYS* | MINGW* ) msys=true ;; #( 115 | NONSTOP* ) nonstop=true ;; 116 | esac 117 | 118 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 119 | 120 | 121 | # Determine the Java command to use to start the JVM. 122 | if [ -n "$JAVA_HOME" ] ; then 123 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 124 | # IBM's JDK on AIX uses strange locations for the executables 125 | JAVACMD=$JAVA_HOME/jre/sh/java 126 | else 127 | JAVACMD=$JAVA_HOME/bin/java 128 | fi 129 | if [ ! -x "$JAVACMD" ] ; then 130 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 131 | 132 | Please set the JAVA_HOME variable in your environment to match the 133 | location of your Java installation." 134 | fi 135 | else 136 | JAVACMD=java 137 | if ! command -v java >/dev/null 2>&1 138 | then 139 | die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 140 | 141 | Please set the JAVA_HOME variable in your environment to match the 142 | location of your Java installation." 143 | fi 144 | fi 145 | 146 | # Increase the maximum file descriptors if we can. 147 | if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then 148 | case $MAX_FD in #( 149 | max*) 150 | # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. 151 | # shellcheck disable=SC2039,SC3045 152 | MAX_FD=$( ulimit -H -n ) || 153 | warn "Could not query maximum file descriptor limit" 154 | esac 155 | case $MAX_FD in #( 156 | '' | soft) :;; #( 157 | *) 158 | # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. 159 | # shellcheck disable=SC2039,SC3045 160 | ulimit -n "$MAX_FD" || 161 | warn "Could not set maximum file descriptor limit to $MAX_FD" 162 | esac 163 | fi 164 | 165 | # Collect all arguments for the java command, stacking in reverse order: 166 | # * args from the command line 167 | # * the main class name 168 | # * -classpath 169 | # * -D...appname settings 170 | # * --module-path (only if needed) 171 | # * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. 172 | 173 | # For Cygwin or MSYS, switch paths to Windows format before running java 174 | if "$cygwin" || "$msys" ; then 175 | APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) 176 | CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) 177 | 178 | JAVACMD=$( cygpath --unix "$JAVACMD" ) 179 | 180 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 181 | for arg do 182 | if 183 | case $arg in #( 184 | -*) false ;; # don't mess with options #( 185 | /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath 186 | [ -e "$t" ] ;; #( 187 | *) false ;; 188 | esac 189 | then 190 | arg=$( cygpath --path --ignore --mixed "$arg" ) 191 | fi 192 | # Roll the args list around exactly as many times as the number of 193 | # args, so each arg winds up back in the position where it started, but 194 | # possibly modified. 195 | # 196 | # NB: a `for` loop captures its iteration list before it begins, so 197 | # changing the positional parameters here affects neither the number of 198 | # iterations, nor the values presented in `arg`. 199 | shift # remove old arg 200 | set -- "$@" "$arg" # push replacement arg 201 | done 202 | fi 203 | 204 | 205 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 206 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 207 | 208 | # Collect all arguments for the java command: 209 | # * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, 210 | # and any embedded shellness will be escaped. 211 | # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be 212 | # treated as '${Hostname}' itself on the command line. 213 | 214 | set -- \ 215 | "-Dorg.gradle.appname=$APP_BASE_NAME" \ 216 | -classpath "$CLASSPATH" \ 217 | org.gradle.wrapper.GradleWrapperMain \ 218 | "$@" 219 | 220 | # Stop when "xargs" is not available. 221 | if ! command -v xargs >/dev/null 2>&1 222 | then 223 | die "xargs is not available" 224 | fi 225 | 226 | # Use "xargs" to parse quoted args. 227 | # 228 | # With -n1 it outputs one arg per line, with the quotes and backslashes removed. 229 | # 230 | # In Bash we could simply go: 231 | # 232 | # readarray ARGS < <( xargs -n1 <<<"$var" ) && 233 | # set -- "${ARGS[@]}" "$@" 234 | # 235 | # but POSIX shell has neither arrays nor command substitution, so instead we 236 | # post-process each arg (as a line of input to sed) to backslash-escape any 237 | # character that might be a shell metacharacter, then use eval to reverse 238 | # that process (while maintaining the separation between arguments), and wrap 239 | # the whole thing up as a single "set" statement. 240 | # 241 | # This will of course break if any of these variables contains a newline or 242 | # an unmatched quote. 243 | # 244 | 245 | eval "set -- $( 246 | printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | 247 | xargs -n1 | 248 | sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | 249 | tr '\n' ' ' 250 | )" '"$@"' 251 | 252 | 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 | @rem SPDX-License-Identifier: Apache-2.0 17 | @rem 18 | 19 | @if "%DEBUG%"=="" @echo off 20 | @rem ########################################################################## 21 | @rem 22 | @rem Gradle startup script for Windows 23 | @rem 24 | @rem ########################################################################## 25 | 26 | @rem Set local scope for the variables with windows NT shell 27 | if "%OS%"=="Windows_NT" setlocal 28 | 29 | set DIRNAME=%~dp0 30 | if "%DIRNAME%"=="" set DIRNAME=. 31 | @rem This is normally unused 32 | set APP_BASE_NAME=%~n0 33 | set APP_HOME=%DIRNAME% 34 | 35 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 36 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 37 | 38 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 39 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 40 | 41 | @rem Find java.exe 42 | if defined JAVA_HOME goto findJavaFromJavaHome 43 | 44 | set JAVA_EXE=java.exe 45 | %JAVA_EXE% -version >NUL 2>&1 46 | if %ERRORLEVEL% equ 0 goto execute 47 | 48 | echo. 1>&2 49 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 50 | echo. 1>&2 51 | echo Please set the JAVA_HOME variable in your environment to match the 1>&2 52 | echo location of your Java installation. 1>&2 53 | 54 | goto fail 55 | 56 | :findJavaFromJavaHome 57 | set JAVA_HOME=%JAVA_HOME:"=% 58 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 59 | 60 | if exist "%JAVA_EXE%" goto execute 61 | 62 | echo. 1>&2 63 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 64 | echo. 1>&2 65 | echo Please set the JAVA_HOME variable in your environment to match the 1>&2 66 | echo location of your Java installation. 1>&2 67 | 68 | goto fail 69 | 70 | :execute 71 | @rem Setup the command line 72 | 73 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 74 | 75 | 76 | @rem Execute Gradle 77 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 78 | 79 | :end 80 | @rem End local scope for the variables with windows NT shell 81 | if %ERRORLEVEL% equ 0 goto mainEnd 82 | 83 | :fail 84 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 85 | rem the _cmd.exe /c_ return code! 86 | set EXIT_CODE=%ERRORLEVEL% 87 | if %EXIT_CODE% equ 0 set EXIT_CODE=1 88 | if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% 89 | exit /b %EXIT_CODE% 90 | 91 | :mainEnd 92 | if "%OS%"=="Windows_NT" endlocal 93 | 94 | :omega -------------------------------------------------------------------------------- /i18n/README.ID.md: -------------------------------------------------------------------------------- 1 | 2 | ![Archivedustry logo](/assets/sprites-override/ui/logo.png) 3 | 4 | > ℹ️ Mod ini sudah dipindahkan dari JSJavaScript yang telah diarsipkan, mod ini hampir sempurna. 5 | 6 | > Bahasa: Bahasa Indonesia 7 | 8 | Sebuah mod yang mengubah soundtrack vanilla menjadi soundtrack Blue Archive, dan juga menambahkan kosmetik untuk unit seperti halo. Mod ini tidak teraffiliasi dengan developer game Blue Archive: Nexon, NAT GAMES dan Yostar. 9 | 10 | ## Daftar Musik 11 | - menu.ogg = Constant Moderato & RE Aoharu (Kamu dapat mengubah itu di pengaturan) 12 | - launch.ogg = ~~Connected Sky~~ Shooting Stars 13 | - game1.ogg = Rolling Beat 14 | - game2.ogg = Acceleration 15 | - game3ogg = KIRISAME 16 | - game4.ogg = Midnight Trip 17 | - game5.ogg = Sakura Punch 18 | - game6.ogg = Formless Dream 19 | - game7.ogg = Vivid Night 20 | - game8.ogg = Crucial Issue 21 | - game9.ogg = KARAKURhythm 22 | - editor.ogg = Mischievous Step 23 | - land.ogg = Aoharu (Intro Sampling) 24 | - boss1.ogg = ~~Tech N Tech~~ Endless Carnival 25 | - boss2.ogg = Out of Control 26 | - fine.ogg = Alkaline Tears 27 | - lose.ogg (tambahan) = Fade Out 28 | - win.ogg (tambahan) = Party Time 29 | - research.ogg (tambahan) = Future Lab 30 | - database.ogg (tambahan) = Future Bossa 31 | - loadout.ogg (tambahan) = MX Adventure 32 | 33 | ## Kredit 34 | - Musik: Nor, Mitsukiyo dan KARUT 35 | -------------------------------------------------------------------------------- /i18n/README.IT.md: -------------------------------------------------------------------------------- 1 | 2 | ![Archivedustry logo](/assets/sprites-override/ui/logo.png) 3 | 4 | [![Build Mod](https://github.com/WilloIzCitron/ArchiveDustry-Java/workflows/Build%20Mod/badge.svg)](https://github.com/WilloIzCitron/ArchiveDustry-Java/actions?query=workflow:"Build+Mod") 5 | [![GitHub release](https://img.shields.io/github/v/tag/WilloIzCitron/ArchiveDustry-Java?filter=%21server-%2A)](https://github.com/WilloIzCitron/ArchiveDustry-Java/releases/) 6 | [![License](https://img.shields.io/badge/License-MIT-blue)](https://github.com/WilloIzCitron/ArchiveDustry-Java/blob/master/LICENSE) 7 | [![issues - ArchiveDustry-Java](https://img.shields.io/github/issues/WilloIzCitron/ArchiveDustry-Java)](https://github.com/WilloIzCitron/ArchiveDustry-Java/issues) 8 | [![Stars - ArchiveDustry-Java](https://img.shields.io/github/stars/WilloIzCitron/ArchiveDustry-Java)](https://github.com/WilloIzCitron/ArchiveDustry-Java/stargazers) 9 | [![GitHub followers of WilloIzCitron](https://img.shields.io/github/followers/WilloIzCitron)](https://github.com/WilloIzCitron) 10 | 11 | 12 | > ℹ️ Questa mod è stata migrata da JSJavaScript, la versione originale è ora archiviata. Questa è la versione da preferire. 13 | 14 | > Lingua: Italiano 15 | 16 | Una mod che sovrascrive la colonna sonora del gioco con quella di Blue Archive, inoltre aggiunge delle aureole cosmetiche alle unità. Questa mod non è affiliata con gli sviluppatori del gioco Blue Archive: Nexon, NAT GAMES e Yostar. 17 | 18 | ## Lista delle Musiche 19 | - menu.ogg = Constant Moderato & RE Aoharu (Selezionabile nelle impostazioni) 20 | - launch.ogg = ~~Connected Sky~~ Shooting Stars 21 | - game1.ogg = Rolling Beat 22 | - game2.ogg = Acceleration 23 | - game3.ogg = KIRISAME 24 | - game4.ogg = Midnight Trip 25 | - game5.ogg = Sakura Punch 26 | - game6.ogg = Formless Dream 27 | - game7.ogg = Vivid Night 28 | - game8.ogg = Crucial Issue 29 | - game9.ogg = KARAKURhythm 30 | - editor.ogg = Mischievous Step 31 | - land.ogg = Aoharu (Solo parte della Intro) 32 | - boss1.ogg = ~~Tech N Tech~~ Endless Carnival 33 | - boss2.ogg = Out of Control 34 | - fine.ogg = Alkaline Tears 35 | - lose.ogg (aggiuntiva) = Fade Out 36 | - win.ogg (aggiuntiva) = Party Time 37 | - research.ogg (aggiuntiva) = Future Lab 38 | - database.ogg (aggiuntiva) = Future Bossa 39 | - loadout.ogg (aggiuntiva) = MX Adventure 40 | 41 | ## Compilazione 42 | 43 | Per generare il jar di questa mod, esegui il comando qui sotto in base alla piattaforma su cui verrà eseguita. 44 | - Android: `gradlew jarAndroid` 45 | - PC: `gradlew jar` 46 | 47 | Per entrambe le piattaforme esegui: `gradlew build` 48 | 49 | ## Versioni all'Avanguardia (Bleeding Edge) 50 | Le Versioni all'Avanguardia (Bleeding Edge) vengono generate automaticamente da Github Actions, puoi trovarle nella sezione Actions selezionando un workflow e poi scaricando l'artefatto. 51 | 52 | ## Crediti 53 | - Musica: Nor, Mitsukiyo e KARUT 54 | -------------------------------------------------------------------------------- /i18n/README.RU.md: -------------------------------------------------------------------------------- 1 | 2 | ![Archivedustry logo](/assets/sprites-override/ui/logo.png) 3 | 4 | [![Build Mod](https://github.com/WilloIzCitron/ArchiveDustry-Java/workflows/Build%20Mod/badge.svg)](https://github.com/WilloIzCitron/ArchiveDustry-Java/actions?query=workflow:"Build+Mod") 5 | [![GitHub release](https://img.shields.io/github/v/tag/WilloIzCitron/ArchiveDustry-Java?filter=%21server-%2A)](https://github.com/WilloIzCitron/ArchiveDustry-Java/releases/) 6 | [![License](https://img.shields.io/badge/License-MIT-blue)](https://github.com/WilloIzCitron/ArchiveDustry-Java/blob/master/LICENSE) 7 | [![issues - ArchiveDustry-Java](https://img.shields.io/github/issues/WilloIzCitron/ArchiveDustry-Java)](https://github.com/WilloIzCitron/ArchiveDustry-Java/issues) 8 | [![Stars - ArchiveDustry-Java](https://img.shields.io/github/stars/WilloIzCitron/ArchiveDustry-Java)](https://github.com/WilloIzCitron/ArchiveDustry-Java/stargazers) 9 | [![GitHub followers of WilloIzCitron](https://img.shields.io/github/followers/WilloIzCitron)](https://github.com/WilloIzCitron) 10 | 11 | 12 | > ℹ️ Этот мод переносился с JSJavaScript и был в архиве, этот мод почти идеален. 13 | 14 | > Язык: Русский 15 | 16 | Этот мод заменяет оригинальные саундтреки саундтреками Blue Archive, также добавляет косметику таким юнитам, как гало. Этот мод никак не связан с разработчиками игры Blue Archive: Nexon, NAT GAMES и Yostar. 17 | 18 | ## Список Саундтреков 19 | - menu.ogg = Constant Moderato & RE Aoharu (Вы можете выбрать это в настройках) 20 | - launch.ogg = ~~Connected Sky~~ Shooting Stars 21 | - game1.ogg = Rolling Beat 22 | - game2.ogg = Acceleration 23 | - game3.ogg = KIRISAME 24 | - game4.ogg = Midnight Trip 25 | - game5.ogg = Sakura Punch 26 | - game6.ogg = Formless Dream 27 | - game7.ogg = Vivid Night 28 | - game8.ogg = Crucial Issue 29 | - game9.ogg = KARAKURhythm 30 | - editor.ogg = Mischievous Step 31 | - land.ogg = Aoharu (Вступительный сэмпл) 32 | - boss1.ogg = ~~Tech N Tech~~ Endless Carnival 33 | - boss2.ogg = Out of Control 34 | - fine.ogg = Alkaline Tears 35 | - lose.ogg (дополнительный) = Fade Out 36 | - win.ogg (дополнительный) = Party Time 37 | - research.ogg (дополнительный) = Future Lab 38 | - database.ogg (дополнительный) = Future Bossa 39 | - loadout.ogg (дополнительный) = MX Adventure 40 | 41 | ## Системные требования мода 42 | 43 | Этот мод требует 4-6ГБ свободной оперативной памяти вашего компьютера. 44 | 45 | ## Компиляция 46 | 47 | Если нужно сгенерировать jar файл мода, вы можете сделать это ниже с помощью jar файла указанного на платформе: 48 | - Android: `gradlew jarAndroid` 49 | - PC: `gradlew jar` 50 | 51 | для развертывания сборки(рабочий стол и андроид) вы можете сделать `gradlew build` 52 | 53 | ## Bleeding Edges(Снапшот) 54 | Каждая сборка BE(Снапшот) была скомпилирована через Действия, вы можете проверить раздел "Действия" и выбрать конкретный рабочий процесс, а затем загрузить артефакт при запуске рабочего процесса. 55 | 56 | ## Кредиты 57 | - Музыка: Nor, Mitsukiyo и KARUT 58 | -------------------------------------------------------------------------------- /i18n/README.zh_CN.md: -------------------------------------------------------------------------------- 1 | ![Archivedustry logo](/assets/sprites-override/ui/logo.png) 2 | 3 | > ℹ️ 此模组已从已归档的JSJavaScript版本迁移而来,目前完成度较高。 4 | 5 | > 语言:简体中文 6 | 7 | 这是一个将游戏原声音乐替换为《蔚蓝档案》配乐,并为单位添加光环等装饰性元素的模组。本模组与《蔚蓝档案》开发商Nexon、NAT GAMES和Yostar无任何关联。 8 | 9 | ## 音乐列表 10 | - menu.ogg = Constant Moderato & RE Aoharu(可通过设置更改) 11 | - launch.ogg = ~~Connected Sky~~ Shooting Stars 12 | - game1.ogg = Rolling Beat 13 | - game2.ogg = Acceleration 14 | - game3.ogg = KIRISAME 15 | - game4.ogg = Midnight Trip 16 | - game5.ogg = Sakura Punch 17 | - game6.ogg = Formless Dream 18 | - game7.ogg = Vivid Night 19 | - game8.ogg = Crucial Issue 20 | - game9.ogg = KARAKURhythm 21 | - editor.ogg = Mischievous Step 22 | - land.ogg = Aoharu (Intro Sampling) 23 | - boss1.ogg = ~~Tech N Tech~~ Endless Carnival 24 | - boss2.ogg = Out of Control 25 | - fine.ogg = Alkaline Tears 26 | - lose.ogg(新增) = Fade Out 27 | - win.ogg(新增) = Party Time 28 | - research.ogg(新增) = Future Lab 29 | - database.ogg(新增) = Future Bossa 30 | - loadout.ogg(新增) = MX Adventure 31 | 32 | ## 制作人员 33 | - 音乐制作:Nor, Mitsukiyo 和 KARUT 34 | -------------------------------------------------------------------------------- /i18n/README.zh_TW.md: -------------------------------------------------------------------------------- 1 | ![Archivedustry logo](/assets/sprites-override/ui/logo.png) 2 | 3 | > ℹ️ 此模組已從已歸檔的JSJavaScript版本遷移而來,目前完成度較高。 4 | 5 | > 語言:繁體中文 6 | 7 | 這是一個將遊戲原聲音樂替換為《蔚藍檔案》配樂,並為單位添加光環等裝飾性元素的模組。本模組與《蔚藍檔案》開發商Nexon、NAT GAMES和Yostar無任何關聯。 8 | 9 | ## 音樂列表 10 | - menu.ogg = Constant Moderato & RE Aoharu(可透過設定更改) 11 | - launch.ogg = ~~Connected Sky~~ Shooting Stars 12 | - game1.ogg = Rolling Beat 13 | - game2.ogg = Acceleration 14 | - game3.ogg = KIRISAME 15 | - game4.ogg = Midnight Trip 16 | - game5.ogg = Sakura Punch 17 | - game6.ogg = Formless Dream 18 | - game7.ogg = Vivid Night 19 | - game8.ogg = Crucial Issue 20 | - game9.ogg = KARAKURhythm 21 | - editor.ogg = Mischievous Step 22 | - land.ogg = Aoharu (Intro Sampling) 23 | - boss1.ogg = ~~Tech N Tech~~ Endless Carnival 24 | - boss2.ogg = Out of Control 25 | - fine.ogg = Alkaline Tears 26 | - lose.ogg(新增) = Fade Out 27 | - win.ogg(新增) = Party Time 28 | - research.ogg(新增) = Future Lab 29 | - database.ogg(新增) = Future Bossa 30 | - loadout.ogg(新增) = MX Adventure 31 | 32 | ## 製作人員 33 | - 音樂製作:Nor, Mitsukiyo 和 KARUT 34 | -------------------------------------------------------------------------------- /mod.json: -------------------------------------------------------------------------------- 1 | { 2 | "displayName": "ArchiveDustry Java", 3 | "author": "WilloIzCitron. Copyrights remains with Nexon, Nexon Games and Yostar", 4 | "description": 5 | "This is a fanmade mod of Blue Archive Soundtrack in Mindustry.\n\n[yellow[]]Purposes:[[]]\nThis mod replace vanilla soundtrack into [blue]Blue [white]Archive []Soundtrack, also add additional soundtrack for essentials and the halo too!.\n\n[red[]]⚠ NOTICE ⚠:[[]]\nThis mod is a fan-made project inspired by Blue Archive and not directly affiliated with it. Copyright remains with the developer and publisher of Blue Archive:Nexon, Nexon Games and Yostar.", 6 | "version": "1.6 build 16", 7 | "minGameVersion": 149, 8 | "dependencies": [], 9 | "java": true, 10 | "hidden": true, 11 | "main": "bluearchive.ArchiveDustry" 12 | } 13 | -------------------------------------------------------------------------------- /settings.gradle.kts: -------------------------------------------------------------------------------- 1 | pluginManagement{ 2 | repositories{ 3 | gradlePluginPortal() 4 | maven("https://raw.githubusercontent.com/GlennFolker/EntityAnnoMaven/main") 5 | } 6 | 7 | plugins{ 8 | val entVersion: String by settings 9 | id("com.github.GlennFolker.EntityAnno") version(entVersion) 10 | } 11 | } 12 | 13 | if(JavaVersion.current().ordinal < JavaVersion.VERSION_17.ordinal){ 14 | throw IllegalStateException("JDK 17 is a required minimum version. Yours: ${System.getProperty("java.version")}") 15 | } 16 | 17 | val modName: String by settings 18 | rootProject.name = modName -------------------------------------------------------------------------------- /src/bluearchive/ArchiveDustry.java: -------------------------------------------------------------------------------- 1 | package bluearchive; 2 | 3 | import arc.*; 4 | import arc.audio.*; 5 | import arc.files.Fi; 6 | import arc.struct.*; 7 | import arc.util.*; 8 | import bluearchive.audio.ArchivDMusic; 9 | import bluearchive.audio.ArchivDSoundControl; 10 | import bluearchive.audio.UnitSound; 11 | import bluearchive.expansions.exoprosopa.ADExoprosopa; 12 | import bluearchive.l2d.Live2DBackgrounds; 13 | import bluearchive.ui.ArchivDUI; 14 | import bluearchive.ui.overrides.ArchivDBackground; 15 | import bluearchive.ui.overrides.ArchivDLoadingFragment; 16 | import bluearchive.ui.overrides.ArchivDSettings; 17 | import mindustry.core.Version; 18 | import mindustry.game.EventType; 19 | import mindustry.mod.*; 20 | import bluearchive.units.*; 21 | import arc.math.*; 22 | import java.time.*; 23 | import java.time.format.DateTimeFormatter; 24 | 25 | import static bluearchive.ui.ArchivDUI.*; 26 | import static mindustry.Vars.*; 27 | 28 | public class ArchiveDustry extends Mod { 29 | public static Music recollectionMusic; 30 | 31 | int foundL2D, loadedL2D, erroredL2D; 32 | 33 | public ArchiveDustry() { 34 | 35 | } 36 | 37 | @Override 38 | public void init(){ 39 | //Use Pal.accent first... experimental Styles 40 | //ArchivDStyles.load(); 41 | if(!mobile || !headless) Core.graphics.setTitle(Core.settings.getAppName()+" v"+Version.buildString()+" | ArchiveDustry v"+mods.getMod("bluearchive").meta.version+ " | "+RandomMessage()); 42 | ArchivDLoadingFragment.init(); 43 | ArchivDSettings.loadSettings(); 44 | if(Core.settings.getBool("ba-addHalo", true)) { 45 | if((mods.getMod("exoprosopa") != null) && (mods.getMod("exoprosopa").enabled())) { 46 | ADExoprosopa.init(); 47 | } 48 | UnitHalo.init(); 49 | } 50 | if(Core.settings.getBool("HinaVoiceEnable") || Core.settings.getBool("ArisuVoiceEnable")) UnitSound.init(); 51 | if(Core.settings.getBool("enableL2D")) { 52 | dataDirectory.child("live2d").walk(f -> { 53 | foundL2D++; 54 | try { 55 | Live2DBackgrounds.load(f); 56 | loadedL2D++; 57 | } catch (Exception e) { 58 | Log.err(e); 59 | erroredL2D++; 60 | } 61 | }); 62 | } 63 | ArchivDMusic.load(); 64 | if (Core.settings.getString("selectedSong") == null) { 65 | Core.settings.put("selectedSong", "menucm"); 66 | } 67 | if (!Core.graphics.isPortrait() && Core.settings.getBool("enableL2D") && Core.settings.has("setL2D-new")) { 68 | if (!Core.settings.getString("setL2D-new").isEmpty()) { 69 | ArchivDBackground.buildL2D(Core.settings.getString("setL2D-new")); 70 | } else { 71 | Core.settings.put("enableL2D", false); //fallback if setl2d is blank 72 | Core.settings.put("selectedSong", "menucm"); 73 | } 74 | } 75 | Events.on(EventType.ClientLoadEvent.class, event -> { 76 | ArchivDUI.init(); 77 | ArchivDSoundControl.loadSoundControl(); 78 | ArchivDSoundControl.replaceMainMenu(); 79 | Log.infoTag("ArchiveDustry", "Fully Loaded!"); 80 | if (Core.settings.getBool("ba-firstTime")) { 81 | firstTimeDialog.show(); 82 | } 83 | Timer.schedule(() -> control.sound.stop(), 0.1f); 84 | 85 | }); 86 | } 87 | 88 | static String RandomMessage(){ 89 | Fi msg = tree.get("text/messages.txt"); 90 | if(!msg.exists()) return "null"; 91 | Seq strings = Seq.with(msg.readString("UTF-8").split("\n")); 92 | int stringLength = strings.size - 1; 93 | return (!LocalDate.now().format(DateTimeFormatter.ofPattern("dd-MM")).equals("01-04")) ? strings.get(Mathf.random(stringLength)) : "Que Bom!"; 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /src/bluearchive/audio/ArchivDMusic.java: -------------------------------------------------------------------------------- 1 | package bluearchive.audio; 2 | 3 | import arc.Core; 4 | import arc.Events; 5 | import arc.audio.Music; 6 | import arc.audio.Sound; 7 | import arc.math.Mathf; 8 | import arc.struct.Seq; 9 | import arc.util.*; 10 | import mindustry.Vars; 11 | import bluearchive.audio.ArchivDSoundControl.*; 12 | import mindustry.content.StatusEffects; 13 | import mindustry.game.EventType; 14 | import mindustry.gen.Musics; 15 | import mindustry.gen.Sounds; 16 | 17 | import java.time.LocalDate; 18 | import java.time.format.DateTimeFormatter; 19 | 20 | import static bluearchive.ArchiveDustry.recollectionMusic; 21 | import static bluearchive.ui.overrides.ArchivDSettings.waveVolume; 22 | import static mindustry.Vars.*; 23 | 24 | public class ArchivDMusic { 25 | public static @Nullable Music current; 26 | public static Seq waveMusic; 27 | private static Seq bossMusic; 28 | public static Music lastMusicPlayed; 29 | private static Music currentPlay; 30 | public static Music 31 | wave1, wave2, wave3, wave4, 32 | cat, aspiration, dawn, bunny, 33 | aira, sugar, hare, oriental, 34 | boss3, boss4, dreamer, game10, 35 | game11, honey, amplify, moment, somedaySometime, t171, theme220, theme228, re_aoh, constMod, 36 | funnyAhh, loadout, database, research, win, lose; 37 | 38 | // I hope this works :) 39 | protected static void playMusic(Music music){ 40 | if(current != null || music == null || !(boolean)((Core.settings.getInt("musicvol") > 0) || waveVolume > 0)) return; 41 | lastMusicPlayed = music; 42 | current = music; 43 | current.setVolume(waveVolume); 44 | current.setLooping(false); 45 | current.play(); 46 | 47 | } 48 | 49 | public static void load(){ 50 | Events.on(EventType.ClientLoadEvent.class, e -> { 51 | current = null; 52 | //music loader 53 | try { 54 | wave1 = new Music(tree.get("music/wave1.ogg")); 55 | wave2 = new Music(tree.get("music/wave2.ogg")); 56 | wave3 = new Music(tree.get("music/wave3.ogg")); 57 | wave4 = new Music(tree.get("music/wave4.ogg")); 58 | cat = new Music(tree.get("music/cat.ogg")); 59 | aspiration = new Music(tree.get("music/aspiration.ogg")); 60 | dawn = new Music(tree.get("music/dawn.ogg")); 61 | bunny = new Music(tree.get("music/bunny.ogg")); 62 | aira = new Music(tree.get("music/menuaira.ogg")); 63 | sugar = new Music(tree.get("music/menurcl.ogg")); 64 | hare = new Music(tree.get("music/hare.ogg")); 65 | oriental = new Music(tree.get("music/oriental.ogg")); 66 | game10 = new Music(tree.get("music/game10.ogg")); 67 | game11 = new Music(tree.get("music/game11.ogg")); 68 | honey = new Music(tree.get("music/honey.ogg")); 69 | dreamer = new Music(tree.get("music/dreamer.ogg")); 70 | boss3 = new Music(tree.get("music/boss3.ogg")); 71 | boss4 = new Music(tree.get("music/boss4.ogg")); 72 | amplify = new Music(tree.get("music/amplify.ogg")); 73 | moment = new Music(tree.get("music/moment.ogg")); 74 | somedaySometime = new Music(tree.get("music/somedaySometime.ogg")); 75 | t171 = new Music(tree.get("music/t171.ogg")); 76 | theme220 = new Music(tree.get("music/theme220.ogg")); 77 | theme228 = new Music(tree.get("music/theme228.ogg")); 78 | re_aoh = new Music(tree.get("music/menure-aoh.ogg")); 79 | constMod = new Music(tree.get("music/menucm.ogg")); 80 | if (LocalDate.now().format(DateTimeFormatter.ofPattern("dd-MM")).equals("01-04")) { 81 | funnyAhh = new Music(tree.get("music/donpolo.ogg")); 82 | Sounds.press = new Sound(tree.get("sounds/queBom.mp3")); 83 | Sounds.back = new Sound(tree.get("sounds/queBom.mp3")); 84 | } 85 | research = Vars.tree.loadMusic("research"); 86 | database = Vars.tree.loadMusic("database"); 87 | loadout = Vars.tree.loadMusic("loadout"); 88 | win = Vars.tree.loadMusic("win"); 89 | lose = Vars.tree.loadMusic("lose"); 90 | } catch (Exception ex) { 91 | // Music has exception throw, why it was created 92 | throw new RuntimeException(ex); 93 | } 94 | 95 | // create wave music soundtrack 96 | waveMusic = Seq.with(Musics.game2, Musics.game5, wave1, aspiration, wave2, wave3, wave4); 97 | // music updater 98 | Log.infoTag("ArchiveDustry", "Music has been loaded!"); 99 | Timer.schedule(() -> { 100 | if(state.isPlaying()) { 101 | // stops if there's no enemy 102 | if (current != null && state.enemies == 0) { 103 | current.stop(); 104 | current = null; 105 | } 106 | // no interruption from ambient soundtrack 107 | if (current != null && Reflect.get(control.sound, "current") != null) { 108 | currentPlay = Reflect.get(control.sound, "current"); 109 | currentPlay.stop(); 110 | } 111 | } 112 | }, 0f, 0.01f); 113 | }); 114 | Events.on(EventType.SectorCaptureEvent.class, e -> { 115 | if (current != null) { 116 | current.stop(); 117 | } 118 | if (!tree.loadMusic("win").isPlaying()) tree.loadMusic("win").play(); 119 | Time.run(306f, () -> { 120 | if (tree.loadMusic("win").isPlaying()) tree.loadMusic("win").stop(); 121 | Time.clear(); 122 | }); 123 | }); 124 | 125 | Events.on(EventType.WinEvent.class, winner -> { 126 | if (current != null) { 127 | current.stop(); 128 | } 129 | if (!tree.loadMusic("win").isPlaying()) tree.loadMusic("win").play(); 130 | ui.restart.hidden(() -> { 131 | if (tree.loadMusic("win").isPlaying()) tree.loadMusic("win").stop(); 132 | }); 133 | }); 134 | // sector captured = win 135 | Events.on(EventType.LoseEvent.class, loser -> { 136 | if (current != null) { 137 | current.stop(); 138 | } 139 | if (!tree.loadMusic("lose").isPlaying()) tree.loadMusic("lose").play(); 140 | ui.restart.hidden(() -> { 141 | if (tree.loadMusic("lose").isPlaying()) tree.loadMusic("lose").stop(); 142 | }); 143 | }); 144 | Events.on(EventType.WaveEvent.class, e -> { 145 | if(state.isPlaying()) { 146 | currentPlay = Reflect.get(control.sound, "current"); 147 | if(currentPlay != null) currentPlay.stop(); 148 | boolean boss = state.rules.spawns.contains(group -> group.getSpawned(state.wave - 2) > 0 && group.effect == StatusEffects.boss); 149 | Time.run(Mathf.random(0.5f, 1f) * 60f, () -> { 150 | playMusic(waveMusic.random(lastMusicPlayed)); 151 | if (boss) { 152 | current.stop(); 153 | current = null; 154 | } 155 | }); 156 | } 157 | }); 158 | 159 | } 160 | } 161 | -------------------------------------------------------------------------------- /src/bluearchive/audio/ArchivDSoundControl.java: -------------------------------------------------------------------------------- 1 | package bluearchive.audio; 2 | 3 | import arc.Core; 4 | import arc.Events; 5 | import arc.audio.Filters; 6 | import arc.audio.Music; 7 | import arc.audio.Sound; 8 | import arc.files.Fi; 9 | import arc.math.Mathf; 10 | import arc.struct.Seq; 11 | import arc.util.*; 12 | import bluearchive.ui.overrides.ArchivDLoadingFragment; 13 | import mindustry.audio.SoundControl; 14 | import mindustry.content.StatusEffects; 15 | import mindustry.game.EventType; 16 | import mindustry.gen.Musics; 17 | import mindustry.gen.Sounds; 18 | 19 | import java.time.LocalDate; 20 | import java.time.format.DateTimeFormatter; 21 | 22 | import static bluearchive.ArchiveDustry.recollectionMusic; 23 | import static bluearchive.audio.ArchivDMusic.*; 24 | import static bluearchive.ui.ArchivDUI.*; 25 | import static mindustry.Vars.*; 26 | import static mindustry.Vars.tree; 27 | 28 | public class ArchivDSoundControl extends SoundControl { 29 | public static Seq ambientMusic, darkMusic, waveMusic, bossMusic = Seq.with(); 30 | protected @Nullable Music current; 31 | private boolean previousLoadFragShow = false; 32 | 33 | public static void loadSoundControl() { 34 | control.sound = new ArchivDSoundControl(); 35 | control.sound.stop(); 36 | } 37 | 38 | @Override 39 | protected void reload() { 40 | current = null; 41 | fade = 0f; 42 | ambientMusic = Seq.with(Musics.game1, Musics.game3, Musics.game6, Musics.game8, Musics.game9, Musics.fine, dawn, cat, bunny, game10, honey, amplify, t171, theme220); 43 | darkMusic = Seq.with(Musics.game7, Musics.game4, aira, sugar, hare, oriental, dreamer, game11,moment, somedaySometime, theme228); 44 | waveMusic = Seq.with(Musics.game2, Musics.game5, wave1, aspiration, wave2, wave3, wave4); 45 | bossMusic = Seq.with(Musics.boss1, Musics.boss2, boss3, boss4); 46 | 47 | for(var sound : Core.assets.getAll(Sound.class, new Seq<>())) { 48 | var file = Fi.get(Core.assets.getAssetFileName(sound)); 49 | if (file.parent().name().equals("ui")) { 50 | sound.setBus(uiBus); 51 | } 52 | } 53 | Events.fire(new EventType.MusicRegisterEvent()); 54 | } 55 | 56 | @Override 57 | public void update() { 58 | boolean paused = state.isGame() && Core.scene.hasDialog(); 59 | boolean playing = state.isGame(); 60 | 61 | //check if current track is finished 62 | if (current != null && !current.isPlaying()) { 63 | current = null; 64 | fade = 0f; 65 | } 66 | 67 | //fade the lowpass filter in/out, poll every 30 ticks just in case performance is an issue 68 | if (timer.get(1, 30f)) { 69 | Core.audio.soundBus.fadeFilterParam(0, Filters.paramWet, paused ? 1f : 0f, 0.4f); 70 | } 71 | 72 | //play/stop ordinary effects 73 | if (playing != wasPlaying) { 74 | wasPlaying = playing; 75 | 76 | if (playing) { 77 | Core.audio.soundBus.play(); 78 | setupFilters(); 79 | } else { 80 | //stopping a single audio bus stops everything else, yay! 81 | Core.audio.soundBus.stop(); 82 | //play music bus again, as it was stopped above 83 | Core.audio.musicBus.play(); 84 | 85 | Core.audio.soundBus.play(); 86 | } 87 | } 88 | 89 | Core.audio.setPaused(Core.audio.soundBus.id, state.isPaused()); 90 | 91 | if(ArchivDLoadingFragment.loadFragShow && !previousLoadFragShow){ 92 | Sounds.chatMessage.play(); 93 | } 94 | previousLoadFragShow = ArchivDLoadingFragment.loadFragShow; 95 | 96 | // Menu state 97 | if (state.isMenu()) { 98 | silenced = false; 99 | 100 | // Planet view 101 | if (ui.planet.isShown()) { 102 | // Database handling in planet view 103 | if (ui.database.isShown() && !ui.research.isShown()) { 104 | this.stop(); 105 | if(!database.isPlaying()) database.play(); 106 | } else { 107 | if(database != null) database.stop(); 108 | } 109 | 110 | // Research handling in planet view 111 | if (ui.research.isShown()) { 112 | this.stop(); 113 | if(!research.isPlaying()) research.play(); 114 | } else { 115 | if(research != null) research.stop(); 116 | } 117 | 118 | // Loadouts handling in planet view 119 | if (ui.planet.loadouts.isShown()) { 120 | this.stop(); 121 | if(!loadout.isPlaying()) loadout.play(); 122 | } else { 123 | if(loadout != null) loadout.stop(); 124 | } 125 | 126 | // Play planet music 127 | play(ui.planet.state.planet.launchMusic); 128 | } else if (ui.editor.isShown()) { 129 | play(Musics.editor); 130 | } else { 131 | if (ui.database.isShown()) { 132 | this.stop(); 133 | if(!database.isPlaying()) database.play(); 134 | } else if (creditsDialog.isShown()) { 135 | this.stop(); 136 | if(!re_aoh.isPlaying()) re_aoh.play(); 137 | } else { 138 | if(database != null) database.stop(); 139 | if(re_aoh != null) re_aoh.stop(); 140 | } 141 | play(Musics.menu); 142 | } 143 | } 144 | // Editor state 145 | else if (state.rules.editor) { 146 | silenced = false; 147 | play(Musics.editor); 148 | } 149 | // In-game state 150 | else { 151 | // Fade out the last track to make way for ingame music 152 | silence(); 153 | 154 | // Database handling in game 155 | if (ui.database.isShown()) { 156 | this.stop(); 157 | if(!database.isPlaying()) database.play(); 158 | } else { 159 | if(database != null) database.stop(); 160 | } 161 | 162 | // Research handling in game 163 | if (ui.research.isShown()) { 164 | this.stop(); 165 | if(!research.isPlaying()) research.play(); 166 | } else { 167 | if(research != null) research.stop(); 168 | } 169 | 170 | // Schematics handling in game 171 | if (ui.schematics.isShown()) { 172 | this.stop(); 173 | if(!loadout.isPlaying()) loadout.play(); 174 | } else { 175 | if(loadout != null) loadout.stop(); 176 | } 177 | 178 | // Random music playback logic 179 | if (Core.settings.getBool("alwaysmusic")) { 180 | if (current == null) { 181 | playRandom(); 182 | } 183 | } else if (Time.timeSinceMillis(lastPlayed) > 1000 * musicInterval / 60f) { 184 | // Chance to play music per interval 185 | if (Mathf.chance(musicChance)) { 186 | lastPlayed = Time.millis(); 187 | playRandom(); 188 | } 189 | } 190 | } 191 | updateLoops(); 192 | } 193 | 194 | public static void replaceMainMenu() { 195 | switch (Core.settings.getString("selectedSong")) { 196 | case "menucm": 197 | if (Musics.menu != tree.loadMusic("menucm")) Musics.menu = !LocalDate.now().format(DateTimeFormatter.ofPattern("dd-MM")).equals("01-04") ? tree.loadMusic("menucm") : ArchivDMusic.funnyAhh; 198 | break; 199 | case "menure-aoh": 200 | if (Musics.menu != tree.loadMusic("menure-aoh")) Musics.menu = !LocalDate.now().format(DateTimeFormatter.ofPattern("dd-MM")).equals("01-04") ? tree.loadMusic("menure-aoh") : ArchivDMusic.funnyAhh; 201 | break; 202 | case "recollection": 203 | if (Musics.menu != recollectionMusic) Musics.menu = !LocalDate.now().format(DateTimeFormatter.ofPattern("dd-MM")).equals("01-04") ? recollectionMusic : ArchivDMusic.funnyAhh; 204 | break; 205 | } 206 | } 207 | } 208 | -------------------------------------------------------------------------------- /src/bluearchive/audio/UnitSound.java: -------------------------------------------------------------------------------- 1 | package bluearchive.audio; 2 | 3 | import arc.*; 4 | import arc.audio.Sound; 5 | import arc.struct.Seq; 6 | import arc.util.Interval; 7 | import arc.util.Log; 8 | import arc.util.Time; 9 | import arc.util.Timer; 10 | import mindustry.content.UnitTypes; 11 | import mindustry.game.EventType.*; 12 | import mindustry.Vars; 13 | import mindustry.gen.Sounds; 14 | 15 | import java.time.LocalDate; 16 | import java.time.format.DateTimeFormatter; 17 | 18 | public class UnitSound { 19 | // Tendou Arisu (Collaris) Assets 20 | static Seq ArisuArrivalSound = Seq.with(); 21 | static Seq ArisuHitSound = Seq.with(); 22 | static Sound ArisuArrivalAssignedSound; 23 | static Seq ArisuShootSound = Seq.with(); 24 | static Sound ArisuPickedSound = new Sound(Vars.tree.get("sounds/units/collaris-pickup.ogg")); 25 | static Sound ArisuArrival1 = new Sound(Vars.tree.get("sounds/units/collaris-arrival1.ogg")); 26 | static Sound ArisuArrival2 = new Sound(Vars.tree.get("sounds/units/collaris-arrival2.ogg")); 27 | static Sound ArisuHit1 = new Sound(Vars.tree.get("sounds/units/collaris-hit1.ogg")); 28 | static Sound ArisuHit2 = new Sound(Vars.tree.get("sounds/units/collaris-hit2.ogg")); 29 | static Sound ArisuHit3 = new Sound(Vars.tree.get("sounds/units/collaris-hit3.ogg")); 30 | static Sound ArisuAttack1 = new Sound(Vars.tree.get("sounds/units/collaris-attack1.ogg")); 31 | static Sound ArisuAttack2 = new Sound(Vars.tree.get("sounds/units/collaris-attack2.ogg")); 32 | static Sound ArisuAttack3 = new Sound(Vars.tree.get("sounds/units/collaris-attack3.ogg")); 33 | static Sound ArisuDeath = new Sound(Vars.tree.get("sounds/units/collaris-death.ogg")); 34 | 35 | // Sorasaki Hina (Toxopid) Assets 36 | static Seq HinaArrivalSound = Seq.with(); 37 | static Seq HinaHitSound = Seq.with(); 38 | static Sound HinaArrivalAssignedSound; 39 | static Seq HinaShootSound = Seq.with(); 40 | static Sound HinaPickedSound = new Sound(Vars.tree.get("sounds/units/toxopid-pickup.ogg")); 41 | static Sound HinaArrival1 = new Sound(Vars.tree.get("sounds/units/toxopid-arrival1.ogg")); 42 | static Sound HinaArrival2 = new Sound(Vars.tree.get("sounds/units/toxopid-arrival2.ogg")); 43 | static Sound HinaHit1 = new Sound(Vars.tree.get("sounds/units/toxopid-hit1.ogg")); 44 | static Sound HinaHit2 = new Sound(Vars.tree.get("sounds/units/toxopid-hit2.ogg")); 45 | static Sound HinaHit3 = new Sound(Vars.tree.get("sounds/units/toxopid-hit3.ogg")); 46 | static Sound HinaAttack1 = new Sound(Vars.tree.get("sounds/units/toxopid-attack1.ogg")); 47 | static Sound HinaAttack2 = new Sound(Vars.tree.get("sounds/units/toxopid-attack2.ogg")); 48 | static Sound HinaAttack3 = new Sound(Vars.tree.get("sounds/units/toxopid-attack3.ogg")); 49 | static Sound HinaArtillery = new Sound(Vars.tree.get("sounds/units/toxopid-artillery.ogg")); 50 | static Sound HinaDeath = new Sound(Vars.tree.get("sounds/units/toxopid-death.ogg")); 51 | 52 | // Interval 53 | static Interval interval = new Interval(5); 54 | 55 | public static void init() { 56 | HinaShootSound = Seq.with(Sounds.shootBig, Sounds.shootBig, Sounds.shootBig, Sounds.shootBig, Sounds.shootBig, Sounds.shootBig, HinaAttack1, HinaAttack2, HinaAttack3); 57 | ArisuShootSound = Seq.with(Sounds.pulseBlast, Sounds.pulseBlast, Sounds.pulseBlast, Sounds.pulseBlast, ArisuAttack1, ArisuAttack2, ArisuAttack3); 58 | Seq HinaArtillerySound = Seq.with(Sounds.shootBig, Sounds.shootBig, Sounds.shootBig, Sounds.shootBig, HinaArtillery); 59 | 60 | 61 | UnitTypes.collaris.deathSound = ArisuDeath; 62 | UnitTypes.toxopid.deathSound = HinaDeath; 63 | Events.on(PayloadDropEvent.class, e -> { 64 | if (Vars.state.isPlaying() || Vars.state.isGame()) { 65 | if (e.unit != null) { 66 | if (e.unit.type == Vars.content.unit("collaris") && (Core.settings.getBool("ArisuVoiceEnable") && !LocalDate.now().format(DateTimeFormatter.ofPattern("dd-MM")).equals("01-04"))) { 67 | if (ArisuPickedSound != null) ArisuPickedSound.stop(); 68 | ArisuArrivalSound = Seq.with(ArisuArrival1, ArisuArrival2); 69 | ArisuArrivalAssignedSound = ArisuArrivalSound.random(); 70 | ArisuArrivalAssignedSound.play(); 71 | } 72 | if (e.unit.type == Vars.content.unit("toxopid") && Core.settings.getBool("HinaVoiceEnable")) { 73 | if (HinaPickedSound != null) HinaPickedSound.stop(); 74 | HinaArrivalSound = Seq.with(HinaArrival1, HinaArrival2); 75 | HinaArrivalAssignedSound = HinaArrivalSound.random(); 76 | HinaArrivalAssignedSound.play(); 77 | } 78 | } 79 | } 80 | }); 81 | Events.on(PickupEvent.class, e -> { 82 | if (Vars.state.isPlaying() || Vars.state.isGame()) { 83 | if (e.unit != null) { 84 | if (e.unit.type == Vars.content.unit("collaris") && (Core.settings.getBool("ArisuVoiceEnable") && !LocalDate.now().format(DateTimeFormatter.ofPattern("dd-MM")).equals("01-04"))) { 85 | if (ArisuArrivalAssignedSound != null) ArisuArrivalAssignedSound.stop(); 86 | ArisuPickedSound.play(); 87 | } 88 | if (e.unit.type == Vars.content.unit("toxopid") && Core.settings.getBool("HinaVoiceEnable")) { 89 | if (HinaArrivalAssignedSound != null) HinaArrivalAssignedSound.stop(); 90 | HinaPickedSound.play(); 91 | } 92 | } 93 | } 94 | }); 95 | Events.on(UnitDamageEvent.class, e -> { 96 | if (Vars.state.isPlaying() || Vars.state.isGame()) { 97 | if ((e.unit.type == Vars.content.unit("collaris") && interval.get(300)) && (Core.settings.getBool("ArisuVoiceEnable") && !LocalDate.now().format(DateTimeFormatter.ofPattern("dd-MM")).equals("01-04"))) { 98 | ArisuHitSound = Seq.with(ArisuHit1, ArisuHit2, ArisuHit3); 99 | if (!e.unit.dead) { 100 | Time.run(0f, () -> ArisuHitSound.random().play()); 101 | } 102 | } 103 | if ((e.unit.type == Vars.content.unit("toxopid") && interval.get(300)) && Core.settings.getBool("HinaVoiceEnable")) { 104 | HinaHitSound = Seq.with(HinaHit1, HinaHit2, HinaHit3); 105 | if (!e.unit.dead) { 106 | Time.run(0f, () -> HinaHitSound.random().play()); 107 | } 108 | } 109 | } 110 | }); 111 | Timer.schedule(() -> { 112 | Sound ArisuAssignedSound = (Core.settings.getBool("ArisuVoiceEnable") && !LocalDate.now().format(DateTimeFormatter.ofPattern("dd-MM")).equals("01-04")) ? ArisuShootSound.random() : Sounds.pulseBlast; 113 | if (ArisuAssignedSound != Sounds.pulseBlast) { 114 | UnitTypes.collaris.weapons.get(0).soundPitchMin = 1f; 115 | UnitTypes.collaris.weapons.get(1).soundPitchMin = 1f; 116 | } else { 117 | UnitTypes.collaris.weapons.get(0).soundPitchMin = 0.8f; 118 | UnitTypes.collaris.weapons.get(1).soundPitchMin = 0.8f; 119 | } 120 | UnitTypes.collaris.weapons.get(0).shootSound = ArisuAssignedSound; 121 | UnitTypes.collaris.weapons.get(1).shootSound = ArisuAssignedSound; 122 | }, 0, 2.15f); 123 | 124 | Timer.schedule(() -> { 125 | Sound HinaAssignedSound = Core.settings.getBool("HinaVoiceEnable") ? HinaShootSound.random() : Sounds.shootBig; 126 | if (HinaAssignedSound != Sounds.shootBig) { 127 | UnitTypes.toxopid.weapons.get(0).soundPitchMin = 1f; 128 | UnitTypes.toxopid.weapons.get(1).soundPitchMin = 1f; 129 | } else { 130 | UnitTypes.toxopid.weapons.get(0).soundPitchMin = 0.8f; 131 | UnitTypes.toxopid.weapons.get(1).soundPitchMin = 0.8f; 132 | } 133 | UnitTypes.toxopid.weapons.get(0).shootSound = HinaAssignedSound; 134 | UnitTypes.toxopid.weapons.get(1).shootSound = HinaAssignedSound; 135 | }, 0, 0.5f); 136 | 137 | Timer.schedule(() -> { 138 | Sound HinaArtilleryAssignedSound = Core.settings.getBool("HinaVoiceEnable") ? HinaArtillerySound.random() : Sounds.shootBig; 139 | if (HinaArtilleryAssignedSound != Sounds.shootBig) { 140 | UnitTypes.toxopid.weapons.get(2).soundPitchMin = 1f; 141 | } else { 142 | UnitTypes.toxopid.weapons.get(2).soundPitchMin = 0.8f; 143 | } 144 | UnitTypes.toxopid.weapons.get(2).shootSound = HinaArtilleryAssignedSound; 145 | }, 0, 3.5f); 146 | 147 | Log.infoTag("ArchiveDustry", "Unit Sounds Loaded!"); 148 | } 149 | } -------------------------------------------------------------------------------- /src/bluearchive/expansions/exoprosopa/ADExoprosopa.java: -------------------------------------------------------------------------------- 1 | package bluearchive.expansions.exoprosopa; 2 | 3 | import bluearchive.expansions.exoprosopa.units.*; 4 | 5 | public class ADExoprosopa { 6 | public static void init() { 7 | ExopUnitHalo.load(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/bluearchive/expansions/exoprosopa/units/ExopUnitHalo.java: -------------------------------------------------------------------------------- 1 | package bluearchive.expansions.exoprosopa.units; 2 | 3 | import arc.graphics.*; 4 | import arc.graphics.g2d.*; 5 | import arc.struct.Seq; 6 | import arc.util.Time; 7 | import mindustry.Vars; 8 | import mindustry.ctype.*; 9 | import mindustry.entities.part.*; 10 | import mindustry.graphics.*; 11 | import mindustry.type.*; 12 | 13 | public class ExopUnitHalo { 14 | public static void load() { 15 | //tanks 16 | UnitType mason = Vars.content.getByName(ContentType.unit, "exoprosopa-15o-01-mason"); 17 | UnitType oktarav = Vars.content.getByName(ContentType.unit, "exoprosopa-15o-02-oktarav"); 18 | UnitType vicient = Vars.content.getByName(ContentType.unit, "exoprosopa-15o-03-vicient"); 19 | UnitType siphon = Vars.content.getByName(ContentType.unit, "exoprosopa-15o-04-siphon"); 20 | UnitType rancor = Vars.content.getByName(ContentType.unit, "exoprosopa-15o-05-rancor"); 21 | //legs 22 | UnitType ares = Vars.content.getByName(ContentType.unit, "exoprosopa-16p-01-ares"); 23 | UnitType rhitle = Vars.content.getByName(ContentType.unit, "exoprosopa-16p-02-rhitle"); 24 | UnitType sender = Vars.content.getByName(ContentType.unit, "exoprosopa-16p-03-sender"); 25 | UnitType carranger = Vars.content.getByName(ContentType.unit, "exoprosopa-16p-04-carragher"); 26 | UnitType xenoct = Vars.content.getByName(ContentType.unit, "exoprosopa-16p-05-xenoct"); 27 | 28 | mason.parts.addAll( 29 | new ShapePart(){{ 30 | color = Color.valueOf("93e2ee"); 31 | layer = Layer.effect; 32 | radius = 3f; 33 | hollow = true; 34 | circle = false; 35 | sides = 6; 36 | stroke = 1.2f; 37 | rotation = 90; 38 | }} 39 | ); 40 | oktarav.parts.addAll( 41 | new ShapePart(){{ 42 | color = Color.valueOf("93e2ee"); 43 | layer = Layer.effect; 44 | radius = 5f; 45 | hollow = true; 46 | circle = false; 47 | sides = 6; 48 | stroke = 1.2f; 49 | rotation = 90; 50 | }}, 51 | new HaloPart(){{ 52 | color = Color.valueOf("93e2ee"); 53 | haloRadius = 6f; 54 | radius = 2f; 55 | sides = 4; 56 | layer = Layer.effect; 57 | shapes = 6; 58 | haloRotation = 0; 59 | }} 60 | ); 61 | vicient.parts.addAll( 62 | new ShapePart() {{ 63 | color = Color.valueOf("93e2ee"); 64 | layer = Layer.effect; 65 | radius = 7f; 66 | hollow = true; 67 | circle = false; 68 | sides = 6; 69 | stroke = 2f; 70 | rotation = 90; 71 | }}, 72 | new DrawPart() { 73 | @Override 74 | public void draw(PartParams partParams) { 75 | Lines.stroke(2f, Color.valueOf("93e2ee")); 76 | Draw.z(Layer.effect); 77 | Lines.spikes(partParams.x, partParams.y, 8, 3, 6, partParams.rotation); 78 | } 79 | 80 | @Override 81 | public void load(String s) { 82 | 83 | } 84 | } 85 | ); 86 | siphon.parts.addAll( 87 | new ShapePart() {{ 88 | color = Color.valueOf("93e2ee"); 89 | layer = Layer.effect; 90 | radius = 6f; 91 | hollow = true; 92 | circle = true; 93 | stroke = 1.5f; 94 | rotation = 90; 95 | }}, 96 | new ShapePart() {{ 97 | color = Color.valueOf("93e2ee"); 98 | layer = Layer.effect; 99 | radius = 10f; 100 | hollow = true; 101 | circle = true; 102 | stroke = 1.7f; 103 | rotation = 90; 104 | }}, 105 | new DrawPart() { 106 | @Override 107 | public void draw(PartParams partParams) { 108 | Lines.stroke(3f, Color.valueOf("93e2ee")); 109 | Draw.z(Layer.effect); 110 | Lines.spikes(partParams.x, partParams.y, 11, 3f, 8, partParams.rotation); 111 | } 112 | 113 | @Override 114 | public void load(String s) { 115 | 116 | } 117 | }, 118 | new HaloPart(){{ 119 | color = Color.valueOf("93e2ee"); 120 | layer = Layer.effect; 121 | radius = 6; 122 | shapes = 8; 123 | tri = true; 124 | triLength = 5; 125 | stroke = 3; 126 | haloRadius = 10; 127 | }} 128 | ); 129 | rancor.parts.addAll( 130 | new ShapePart() {{ 131 | color = Color.valueOf("93e2ee"); 132 | layer = Layer.effect; 133 | radius = 9f; 134 | hollow = true; 135 | circle = false; 136 | sides = 6; 137 | stroke = 2f; 138 | rotation = 90; 139 | }}, 140 | new HaloPart(){{ 141 | color = Color.valueOf("93e2ee"); 142 | layer = Layer.effect; 143 | radius = 6; 144 | shapes = 8; 145 | tri = true; 146 | triLength = 5; 147 | stroke = 3; 148 | haloRadius = 15; 149 | haloRotateSpeed = 1; 150 | }}, 151 | new ShapePart() {{ 152 | color = Color.valueOf("93e2ee"); 153 | layer = Layer.effect; 154 | radius = 15f; 155 | hollow = true; 156 | circle = true; 157 | stroke = 1.7f; 158 | rotateSpeed = 1; 159 | }}, 160 | new DrawPart() { 161 | @Override 162 | public void draw(PartParams partParams) { 163 | Lines.stroke(2f, Color.valueOf("93e2ee")); 164 | Draw.z(Layer.effect); 165 | Lines.spikes(partParams.x, partParams.y, 10, 3, 6, partParams.rotation); 166 | Lines.stroke(2f, Color.valueOf("93e2ee")); 167 | Lines.lineAngle(partParams.x, partParams.y, partParams.rotation + partParams.smoothReload * 360, 5); 168 | Lines.lineAngle(partParams.x, partParams.y, partParams.rotation + (Time.time/360), 3); 169 | Lines.stroke(3f, Color.valueOf("93e2ee")); 170 | Lines.spikes(partParams.x, partParams.y, 16, 3f, 8, (partParams.rotation + 1 * Time.time)); 171 | } 172 | 173 | @Override 174 | public void load(String s) { 175 | 176 | } 177 | }, 178 | new ShapePart() {{ 179 | color = Color.valueOf("93e2ee"); 180 | layer = Layer.effect; 181 | radius = 10f; 182 | hollow = true; 183 | circle = true; 184 | stroke = 1.7f; 185 | rotation = 90; 186 | }} 187 | ); 188 | ares.parts.add( 189 | new ShapePart(){{ 190 | color = Color.valueOf("d45050"); 191 | layer = Layer.effect; 192 | radius = 4f; 193 | hollow = true; 194 | circle = true; 195 | stroke = 1.7f; 196 | y = -2f; 197 | rotation = 90; 198 | }} 199 | ); 200 | rhitle.parts.add( 201 | new FlarePart(){{ 202 | color1 = Color.valueOf("d45050"); 203 | sides = 5; 204 | followRotation = true; 205 | radius = 8f; 206 | y = -2f; 207 | stroke = 4f; 208 | }}, 209 | new ShapePart(){{ 210 | color = Color.valueOf("d45050"); 211 | layer = Layer.effect; 212 | radius = 6f; 213 | hollow = true; 214 | circle = true; 215 | stroke = 1.7f; 216 | rotation = 90; 217 | y = -2f; 218 | }} 219 | ); 220 | sender.parts.addAll( 221 | new ShapePart(){{ 222 | hollow = true; 223 | stroke = 1.2f; 224 | radius = 6; 225 | circle = true; 226 | y = -4; 227 | color = Color.valueOf("d45050"); 228 | layer = Layer.effect; 229 | }}, 230 | new ShapePart(){{ 231 | hollow = true; 232 | stroke = 1.7f; 233 | radius = 9; 234 | circle = true; 235 | y = -4; 236 | color = Color.valueOf("d45050"); 237 | layer = Layer.effect; 238 | }}, 239 | new HaloPart(){{ 240 | haloRotation = 45; 241 | triLength = 9; 242 | tri = true; 243 | shapes = 4; 244 | radius = 2f; 245 | haloRadius = 7.5f; 246 | y = -4; 247 | color = Color.valueOf("d45050"); 248 | layer = Layer.effect; 249 | }}, 250 | new HaloPart(){{ 251 | haloRotation = 45; 252 | shapeRotation = 180; 253 | triLength = 3; 254 | tri = true; 255 | shapes = 4; 256 | radius = 2f; 257 | haloRadius = 7.5f; 258 | y = -4; 259 | color = Color.valueOf("d45050"); 260 | layer = Layer.effect; 261 | }}, 262 | new HaloPart(){{ 263 | haloRotation = 45; 264 | shapeRotation = 180; 265 | triLength = 6; 266 | tri = true; 267 | shapes = 4; 268 | radius = 1.5f; 269 | haloRadius = 9; 270 | y = -4; 271 | color = Color.valueOf("d45050"); 272 | layer = Layer.effect; 273 | }} 274 | ); 275 | carranger.parts.addAll( 276 | new FlarePart(){{ 277 | color1 = Color.valueOf("d45050"); 278 | sides = 4; 279 | followRotation = true; 280 | radius = 8f; 281 | y = -4f; 282 | stroke = 4f; 283 | }}, 284 | new ShapePart(){{ 285 | hollow = true; 286 | stroke = 1.7f; 287 | radius = 7; 288 | circle = true; 289 | y = -4; 290 | color = Color.valueOf("d45050"); 291 | layer = Layer.effect; 292 | }}, 293 | new ShapePart(){{ 294 | hollow = true; 295 | stroke = 1.7f; 296 | radius = 11; 297 | circle = true; 298 | y = -4; 299 | color = Color.valueOf("d45050"); 300 | layer = Layer.effect; 301 | }}, 302 | new HaloPart(){{ 303 | haloRotation = 45; 304 | triLength = 8; 305 | tri = true; 306 | shapes = 4; 307 | radius = 1.5f; 308 | haloRadius = 10; 309 | y = -4; 310 | color = Color.valueOf("d45050"); 311 | layer = Layer.effect; 312 | }}, 313 | new HaloPart(){{ 314 | haloRotation = 90; 315 | shapeRotation = 180; 316 | tri = true; 317 | triLength = 4; 318 | shapes = 6; 319 | radius = 1.5f; 320 | haloRadius = 10; 321 | y = -4; 322 | color = Color.valueOf("d45050"); 323 | layer = Layer.effect; 324 | }} 325 | ); 326 | xenoct.parts.addAll( 327 | new FlarePart(){{ 328 | color1 = Color.valueOf("d45050"); 329 | sides = 4; 330 | followRotation = true; 331 | radius = 12f; 332 | y = -4f; 333 | stroke = 2f; 334 | }}, 335 | new FlarePart(){{ 336 | color1 = Color.valueOf("d45050"); 337 | sides = 8; 338 | followRotation = true; 339 | radius = 8f; 340 | y = -4f; 341 | stroke = 4f; 342 | }}, 343 | new ShapePart(){{ 344 | hollow = true; 345 | stroke = 1.7f; 346 | radius = 12; 347 | circle = true; 348 | y = -4; 349 | color = Color.valueOf("d45050"); 350 | layer = Layer.effect; 351 | }}, 352 | new ShapePart(){{ 353 | hollow = true; 354 | stroke = 1.7f; 355 | radius = 16; 356 | circle = true; 357 | y = -4; 358 | color = Color.valueOf("d45050"); 359 | layer = Layer.effect; 360 | }}, 361 | new HaloPart(){{ 362 | haloRotation = 45; 363 | triLength = 15; 364 | shapes = 4; 365 | tri = true; 366 | radius = 1.5f; 367 | haloRadius = 15; 368 | y = -4; 369 | color = Color.valueOf("d45050"); 370 | layer = Layer.effect; 371 | }}, 372 | new HaloPart(){{ 373 | haloRotation = 90; 374 | shapeRotation = 180; 375 | triLength = 9; 376 | tri = true; 377 | shapes = 6; 378 | radius = 1.5f; 379 | haloRadius = 15; 380 | y = -4; 381 | color = Color.valueOf("d45050"); 382 | layer = Layer.effect; 383 | }} 384 | ); 385 | } 386 | } 387 | -------------------------------------------------------------------------------- /src/bluearchive/l2d/Live2DBackgrounds.java: -------------------------------------------------------------------------------- 1 | package bluearchive.l2d; 2 | 3 | import arc.Core; 4 | import arc.audio.Music; 5 | import arc.files.*; 6 | import arc.graphics.Texture; 7 | import arc.struct.*; 8 | import arc.util.Log; 9 | import arc.util.Nullable; 10 | import arc.util.serialization.*; 11 | 12 | import java.util.Objects; 13 | import java.util.concurrent.atomic.AtomicInteger; 14 | 15 | public class Live2DBackgrounds { 16 | public static Seq live2ds = new Seq<>(); 17 | public static JsonReader reader = new JsonReader(); 18 | public static Music soundTrack = new Music(); 19 | 20 | public static void load(Fi live2d) throws Exception { 21 | ZipFi f = new ZipFi(live2d); 22 | Seq loadedL2ds = new Seq<>(); 23 | Seq rawL2d = new Seq<>(); 24 | String s; 25 | if (!f.child("live2d.hjson").exists() && !f.child("live2d.json").exists()) throw new L2DMetaMissingException("Live2d \'"+ live2d.nameWithoutExtension()+ "\' has no live2d.hjson or live2d.json in metadata"); 26 | if (f.child("live2d.hjson").exists()) {s = f.child("live2d.hjson").readString();} else {s = f.child("live2d.json").readString();} 27 | if(!s.startsWith("{")) s = "{\n" + s + "\n}"; 28 | L2DMeta meta = metaBuild(reader.parse(s)); 29 | AtomicInteger L2DCount = new AtomicInteger(); 30 | // Don't load all frames on every pack, only selected frames on pack 31 | if(Objects.equals(Core.settings.getString("setL2D-new"), meta.name)) { 32 | f.child("l2d").walk(l2dFound -> { 33 | L2DCount.getAndIncrement(); /*Log.infoTag("ArchiveDustry Debug", "L2D loaded no: "+(L2DCount.get())+" with filename "+(l2dFound.name())+" from "+(meta.name));*/ 34 | try { 35 | rawL2d.add(l2dFound); 36 | } catch (RuntimeException e) { 37 | throw new L2DNoFramesException("No frames found inside the Live2D zip file"); 38 | } 39 | }); 40 | for (int i = 0; i <= L2DCount.get() - 1; i++) { 41 | int finalI = i; 42 | loadedL2ds.add(new Texture(rawL2d.find(m -> Objects.equals(m.nameWithoutExtension(), String.valueOf(finalI + 1))))); 43 | } 44 | rawL2d.clear(); 45 | } 46 | if(!meta.isSoundTrackLocal) { 47 | try { 48 | Fi track = f.child("soundtrack.ogg"); 49 | if (track.exists()) { 50 | soundTrack = new Music(track); 51 | } else { 52 | Fi trackMP3 = f.child("soundtrack.mp3"); 53 | if (trackMP3.exists()) { 54 | soundTrack = new Music(trackMP3); 55 | } 56 | } 57 | } catch (RuntimeException r) { 58 | throw new RuntimeException("Live2d \'"+(meta.name)+ "\' uses an external soundtrack file, but it does not have one. (is it was named incorrectly?)"); 59 | 60 | } 61 | } 62 | LoadedL2D l2d = new LoadedL2D(meta.name, live2d, meta, meta.frameSpeed, meta.isSoundTrackLocal, meta.localSoundTrack, loadedL2ds, soundTrack); 63 | Log.infoTag("ArchiveDustry", (meta.displayName)+ " has been loaded!"); 64 | live2ds.add(l2d); 65 | } 66 | 67 | public static @Nullable LoadedL2D getL2D(String name){ 68 | return live2ds.find(m -> Objects.equals(m.name, name)); 69 | } 70 | 71 | private static L2DMeta metaBuild(JsonValue root) { 72 | L2DMeta meta = new L2DMeta(); 73 | meta.name = root.getString("name"); 74 | meta.displayName = root.getString("displayName"); 75 | meta.author = root.getString("author", null); 76 | meta.description = root.getString("description", null); 77 | meta.frameSpeed = root.getFloat("frameSpeed", 0f); 78 | meta.isSoundTrackLocal = root.getBoolean("isSoundTrackLocal", false); 79 | meta.localSoundTrack = root.getString("localSoundTrack", null); 80 | return meta; 81 | } 82 | 83 | public static class LoadedL2D{ 84 | /* Internal name, display name and author who made this package. */ 85 | public final String name, displayName, author; 86 | public final Fi file; 87 | public final L2DMeta meta; 88 | /* Frame speed of Live2D, how fast could it run. */ 89 | public final float frameSpeed; 90 | /* Loaded Live2D frames are inside of Sequence, they can be loaded on `ArchivDBackground.java` */ 91 | public final Seq loadedL2ds; 92 | /* Custom Soundtrack for Live2D, must be named "soundtrack.ogg" or "soundtrack.mp3". */ 93 | public final @Nullable Music soundTrack; 94 | /* 95 | * Local Soundtrack means the internal mod soundtrack. 96 | * `isSoundTrackLocal` is a boolean that Live2D package use internal mod soundtrack as main menu music. 97 | * `localSoundTrack` is a music name of local mod soundtrack. 98 | */ 99 | public final boolean isSoundTrackLocal; 100 | public final @Nullable String localSoundTrack; 101 | public final int width, height; 102 | 103 | public LoadedL2D(String name, Fi file, L2DMeta meta/*, int frames*/, float frameSpeed, boolean isSoundTrackLocal, @Nullable String localSoundTrack, Seq loadedL2ds, Music soundTrack) { 104 | this.name = name; 105 | this.file = file; 106 | this.displayName = meta.displayName; 107 | this.author = meta.author; 108 | this.meta = meta; 109 | //this.frames = frames; 110 | this.frameSpeed = frameSpeed; 111 | this.loadedL2ds = loadedL2ds; 112 | this.soundTrack = soundTrack; 113 | this.isSoundTrackLocal = isSoundTrackLocal; 114 | this.localSoundTrack = localSoundTrack; 115 | this.width = (loadedL2ds.size != 0) ? loadedL2ds.get(0).width : 0; 116 | this.height = (loadedL2ds.size != 0) ? loadedL2ds.get(0).height : 0; 117 | } 118 | } 119 | 120 | public static class L2DMeta{ 121 | String name; 122 | float frameSpeed; 123 | @Nullable String displayName, author, description, localSoundTrack; 124 | boolean isSoundTrackLocal; 125 | // Blank, because there's no script were used on Live2D(Recollection Lobby) 126 | 127 | } 128 | 129 | public static class L2DMetaMissingException extends RuntimeException{ 130 | 131 | public L2DMetaMissingException(){ 132 | } 133 | 134 | public L2DMetaMissingException(String message){ 135 | super(message); 136 | } 137 | 138 | public L2DMetaMissingException(String message, Throwable cause){ 139 | super(message, cause); 140 | } 141 | 142 | public L2DMetaMissingException(Throwable cause){ 143 | super(cause); 144 | } 145 | 146 | } 147 | public static class L2DNoFramesException extends RuntimeException{ 148 | public L2DNoFramesException(){ 149 | } 150 | public L2DNoFramesException(String message){super(message);} 151 | public L2DNoFramesException(Throwable cause){super(cause);} 152 | public L2DNoFramesException(String message, Throwable cause){super(message, cause);} 153 | } 154 | } -------------------------------------------------------------------------------- /src/bluearchive/ui/ArchivDStyles.java: -------------------------------------------------------------------------------- 1 | package bluearchive.ui; 2 | 3 | import mindustry.ui.*; 4 | 5 | import arc.scene.style.*; 6 | import mindustry.gen.*; 7 | import mindustry.graphics.*; 8 | 9 | public class ArchivDStyles extends Styles{ 10 | 11 | public static void load(){ 12 | var whiteui = (TextureRegionDrawable)Tex.whiteui; 13 | accentDrawable = whiteui.tint(Pal.techBlue); 14 | 15 | nonet.overFontColor = Pal.techBlue; 16 | emptyi.imageDownColor = Pal.techBlue; 17 | geni.imageDownColor = Pal.techBlue; 18 | defaultDialog.titleFontColor = Pal.techBlue; 19 | fullDialog.titleFontColor = Pal.techBlue; 20 | techLabel.fontColor = Pal.techBlue; 21 | defaultt.downFontColor = Pal.techBlue; 22 | defaulti.imageDownColor = Pal.techBlue; 23 | flatt.downFontColor = Pal.techBlue; 24 | flati.imageDownColor = Pal.techBlue; 25 | flatBordert.downFontColor = Pal.techBlue; 26 | defaultCheck.checkedFontColor = Pal.techBlue; 27 | 28 | defaultt.overFontColor = Pal.techBlue; 29 | defaulti.imageOverColor = Pal.techBlue; 30 | flatt.overFontColor = Pal.techBlue; 31 | flatBordert.overFontColor = Pal.techBlue; 32 | flati.imageOverColor = Pal.techBlue; 33 | squarei.imageDownColor = Pal.techBlue; 34 | squarei.imageOverColor = Pal.techBlue; 35 | defaultt.checkedFontColor = Pal.techBlue; 36 | defaulti.imageCheckedColor = Pal.techBlue; 37 | flatt.checkedFontColor = Pal.techBlue; 38 | flati.imageCheckedColor = Pal.techBlue; 39 | squarei.imageCheckedColor = Pal.techBlue; 40 | defaultt.checkedOverFontColor = Pal.techBlue; 41 | flatt.checkedOverFontColor = Pal.techBlue; 42 | 43 | } 44 | } 45 | 46 | -------------------------------------------------------------------------------- /src/bluearchive/ui/ArchivDUI.java: -------------------------------------------------------------------------------- 1 | package bluearchive.ui; 2 | 3 | import bluearchive.ui.dialogs.*; 4 | 5 | public class ArchivDUI { 6 | 7 | public static ArchivDCreditsDialog creditsDialog = new ArchivDCreditsDialog(); 8 | public static ArchivDFirstTimeDialog firstTimeDialog = new ArchivDFirstTimeDialog(); 9 | //public static ArchivDMenu menuDialog = new ArchivDMenu(); wip 10 | 11 | public static void init() { 12 | creditsDialog.hide(); 13 | firstTimeDialog.hide(); 14 | } 15 | 16 | public static void showCredits() { 17 | creditsDialog.show(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/bluearchive/ui/dialogs/ArchivDCreditsDialog.java: -------------------------------------------------------------------------------- 1 | package bluearchive.ui.dialogs; 2 | 3 | import arc.Core; 4 | import arc.input.KeyCode; 5 | import arc.scene.style.TextureRegionDrawable; 6 | import arc.scene.ui.Dialog; 7 | import arc.scene.ui.Image; 8 | import arc.scene.ui.layout.Table; 9 | import arc.util.Align; 10 | import arc.util.Scaling; 11 | import arc.util.Time; 12 | import bluearchive.audio.ArchivDMusic; 13 | import mindustry.gen.Tex; 14 | import mindustry.ui.Styles; 15 | 16 | import static mindustry.Vars.*; 17 | 18 | public class ArchivDCreditsDialog extends Dialog { 19 | final Image modLogo = new Image(new TextureRegionDrawable(Core.atlas.find("bluearchive-logo")), Scaling.fit); 20 | final Image nekoUILogo = new Image(new TextureRegionDrawable(Core.atlas.find("bluearchive-nekoui")), Scaling.fit); 21 | final Image nexonLogo = new Image(new TextureRegionDrawable(Core.atlas.find("bluearchive-creditpart")), Scaling.fit); 22 | int touch = 0; 23 | Table in = new Table(){{ 24 | center(); 25 | add(modLogo).size(768, 153).row(); 26 | image(Tex.clear).height(25f).padTop(3f).row(); 27 | add("Developed by").row(); 28 | image(Tex.clear).height(5f).padTop(3f).row(); 29 | add("WilloIzCitron").row(); 30 | image(Tex.clear).height(25f).padTop(3f).row(); 31 | image(Tex.clear).height(5f).padTop(3f).row(); 32 | add("Music by").row(); 33 | add("Nor").row(); 34 | add("Mitsukiyo").row(); 35 | add("KARUT").row(); 36 | image(Tex.clear).height(25f).padTop(3f).row(); 37 | add("Music list").row(); 38 | image(Tex.clear).height(5f).padTop(3f).row(); 39 | add("menu.ogg = Constant Moderato & RE Aoharu").row(); 40 | add("launch.ogg = Shooting Stars").row(); 41 | add("game1.ogg = Rolling Beat").row(); 42 | add("game2.ogg = Acceleration").row(); 43 | add("game3.ogg = KIRISAME").row(); 44 | add("game4.ogg = Midnight Trip").row(); 45 | add("game6.ogg = Formless Dream").row(); 46 | add("game7.ogg = Vivid Night").row(); 47 | add("game8.ogg = Crucial Issue").row(); 48 | add("game9.ogg = KARAKURhythm").row(); 49 | add("editor.ogg = Mischievous Step").row(); 50 | add("land.ogg = Aoharu (Intro Sampling)").row(); 51 | add("boss1.ogg = Endless Carnival").row(); 52 | add("boss2.ogg = Out of Control").row(); 53 | add("fine.ogg = Alkaline Tears").row(); 54 | image(Tex.clear).height(10f).padTop(3f).row(); 55 | add("lose.ogg (additional) = Fade Out").row(); 56 | add("win.ogg (additional) = Party Time").row(); 57 | add("research.ogg (additional) = Future Lab").row(); 58 | add("database.ogg (additional) = Future Bossa").row(); 59 | add("loadout.ogg (additional) = MX Adventure").row(); 60 | image(Tex.clear).height(25f).padTop(3f).row(); 61 | add("Mod Contributor and Translator").row(); 62 | image(Tex.clear).height(5f).padTop(3f).row(); 63 | add("VDGaster").row(); 64 | image(Tex.clear).height(25f).padTop(3f).row(); 65 | add("Legal Notice").row(); 66 | image(Tex.clear).height(5f).padTop(3f).row(); 67 | add("This is a fanmade mod! it obeys the Fankit Guidelines.").row(); 68 | add("THIS MOD IS NOT INTENDED FOR COMMERCIAL USE!").row(); 69 | image(Tex.clear).height(2f).padTop(3f).row(); 70 | image(Tex.clear).height(1f).padTop(3f).row(); 71 | add("Mindustry is developed by Anuke, and is licensed under GNU GPLv3.0").row(); 72 | image(Tex.clear).height(1f).padTop(3f).row(); 73 | add("This mod is MIT Licensed").row(); 74 | image(Tex.clear).height(25f).padTop(25f).row(); 75 | add("Special Thanks for: NekoUI by Hans404 and BetMC by BetSoi2411").row(); 76 | add(nekoUILogo).size(420f/2,185f/2).row(); 77 | image(Tex.clear).height(25f).padTop(25f).row(); 78 | add("Blue Archive is copyrighted to Nexon, Nexon Games and Yostar. All Rights Reserved").row(); 79 | add(nexonLogo).size(522, 82).row(); 80 | image(Tex.clear).height(1280).padTop(25f).row(); 81 | //logo for 82 | }}; 83 | float scrollBar; 84 | float tableHeight = in.getHeight(); 85 | float halfTableHeight = tableHeight / 2; 86 | DialogStyle creditDialog = new DialogStyle(){{ 87 | background = Styles.none; 88 | }}; 89 | public ArchivDCreditsDialog(){ 90 | super(); 91 | //addCloseButton(); 92 | scrollBar = 0f; 93 | } 94 | 95 | @Override 96 | public void act(float delta) { 97 | super.act(delta); 98 | if(tableHeight <= 0) { 99 | tableHeight = in.getHeight(); 100 | halfTableHeight = tableHeight / 2; 101 | } 102 | 103 | scrollBar += 0.5f * Time.delta; 104 | cont.clearChildren(); 105 | in.update(()-> setTranslation(0f, scrollBar - (halfTableHeight + Core.camera.height))); 106 | cont.add(in).align(Align.bottom); 107 | setStyle(creditDialog); 108 | if(((scrollBar > (halfTableHeight * 2f)) && tableHeight > 0) || Core.input.keyDown(KeyCode.escape) || Core.input.isTouched()) { 109 | touch = touch + 1; 110 | if(touch == 2) { 111 | this.hide(); 112 | touch = 0; 113 | } 114 | } 115 | } 116 | 117 | @Override 118 | public void draw() { 119 | Styles.black.draw(0, 0, Core.graphics.getWidth(), Core.graphics.getHeight()); 120 | super.draw(); 121 | } 122 | 123 | @Override 124 | public boolean isShown(){ 125 | return getScene() != null; 126 | } 127 | } 128 | 129 | -------------------------------------------------------------------------------- /src/bluearchive/ui/dialogs/ArchivDFirstTimeDialog.java: -------------------------------------------------------------------------------- 1 | package bluearchive.ui.dialogs; 2 | 3 | import arc.Core; 4 | import mindustry.ui.dialogs.BaseDialog; 5 | 6 | public class ArchivDFirstTimeDialog extends BaseDialog { 7 | public ArchivDFirstTimeDialog() { 8 | super(Core.bundle.get("ba-firstTimeDialog.title")); 9 | cont.image(Core.atlas.find("bluearchive-mikalove")).pad(20).size(200f, 200f).row(); 10 | cont.add(Core.bundle.get("ba-firstTimeDialog.description")).row(); 11 | cont.button(Core.bundle.get("ba-firstTimeDialog.button"), this::hide).size(200f, 50f).row(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/bluearchive/ui/dialogs/ArchivDLive2DManager.java: -------------------------------------------------------------------------------- 1 | package bluearchive.ui.dialogs; 2 | 3 | import arc.Core; 4 | import arc.graphics.Color; 5 | import arc.scene.ui.Dialog; 6 | import arc.scene.ui.ScrollPane; 7 | import arc.scene.ui.layout.*; 8 | import mindustry.ui.Styles; 9 | import mindustry.ui.dialogs.BaseDialog; 10 | 11 | import static arc.Core.*; 12 | import static bluearchive.l2d.Live2DBackgrounds.live2ds; 13 | 14 | public class ArchivDLive2DManager extends BaseDialog { 15 | //TODO: make another dialog in order to view Live2D(Recollection) Metadata 16 | Dialog restartDialog = new Dialog(){{ 17 | cont.add(new Table(){{ 18 | cont.image(atlas.find("bluearchive-arona-happy")).size(256,256).center().row(); 19 | new Table(){{ 20 | cont.add("Arona").left().row(); 21 | cont.add(bundle.get("ba-restartDialogText")).right().row(); 22 | cont.button(bundle.get("ba-restartConfirm"), Styles.flatt, () -> Core.app.exit()).size(250f, 50f); 23 | }}; 24 | }}); 25 | }}; 26 | Table tabl = new Table(){{ 27 | live2ds.each(l -> cont.button(con -> { 28 | con.row(); 29 | con.add(l.displayName).row(); 30 | con.add(bundle.formatString(bundle.get("ba-l2d.author"), l.author)).color(Color.gray).bottom().row(); 31 | }, Styles.flatBordert, () -> { Core.settings.put("setL2D-new", l.name); restartDialog.show();}).growX().row()); 32 | }}; 33 | ScrollPane scrl = new ScrollPane(tabl, Styles.defaultPane); 34 | 35 | public ArchivDLive2DManager(){ 36 | super(bundle.get("ba-l2dManager")); 37 | addCloseButton(); 38 | scrl.draw(); 39 | cont.pane(tabl).scrollX(false).row(); 40 | show(); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/bluearchive/ui/dialogs/ArchivDLive2DSelectionDialog.java: -------------------------------------------------------------------------------- 1 | package bluearchive.ui.dialogs; 2 | 3 | import arc.Core; 4 | import arc.scene.actions.Actions; 5 | import arc.scene.ui.Dialog; 6 | import arc.scene.ui.TextButton; 7 | import bluearchive.ui.overrides.ArchivDBackground; 8 | import mindustry.gen.Icon; 9 | import mindustry.gen.Tex; 10 | import mindustry.graphics.Pal; 11 | import mindustry.ui.Styles; 12 | 13 | 14 | public class ArchivDLive2DSelectionDialog extends Dialog { 15 | private static TextButton a,b,c; 16 | public ArchivDLive2DSelectionDialog() { 17 | super(); 18 | row(); 19 | add(Core.bundle.get("ba-caution")).color(Pal.techBlue).style(Styles.techLabel).fontScale(2f).row(); 20 | image(Tex.whiteui, Pal.techBlue).width(450f).height(3f).pad(4f).center().row(); 21 | add(Core.bundle.get("ba-caution-text")).style(Styles.defaultLabel).row(); 22 | table(t -> { 23 | a = t.button(Core.bundle.get("ba-l2dInstallLocally"), Icon.download, () -> { this.hide(); Core.settings.put("live2dinstalled", true);}).padLeft(8f).padTop(3f).width(250f).get(); 24 | b = t.button(Core.bundle.get("ba-l2dInstallRepo"), Icon.download, ArchivDBackground::downloadLive2D).padLeft(8f).padTop(3f).width(250f).get(); 25 | c = t.button(Core.bundle.get("cancel"), Icon.left, this::hide).padLeft(8f).padTop(3f).width(250f).get(); 26 | }).center(); 27 | show(); 28 | } 29 | 30 | @Override 31 | public Dialog show() { 32 | a.actions(Actions.fadeIn(1f), Actions.visible(true)); 33 | b.actions(Actions.fadeIn(2f), Actions.visible(true)); 34 | c.actions(Actions.fadeIn(3f), Actions.visible(true)); 35 | return super.show(); 36 | } 37 | 38 | @Override 39 | public void hide() { 40 | a.clearActions(); 41 | b.clearActions(); 42 | c.clearActions(); 43 | super.hide(); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/bluearchive/ui/overrides/ArchivDBackground.java: -------------------------------------------------------------------------------- 1 | package bluearchive.ui.overrides; 2 | 3 | import arc.Core; 4 | import arc.Events; 5 | import arc.files.Fi; 6 | import arc.files.ZipFi; 7 | import arc.func.Boolp; 8 | import arc.func.Floatc; 9 | import arc.graphics.g2d.TextureRegion; 10 | import arc.scene.Element; 11 | import arc.scene.Group; 12 | import arc.scene.ui.Image; 13 | import arc.util.*; 14 | import arc.util.serialization.Jval; 15 | import bluearchive.ArchiveDustry; 16 | import bluearchive.l2d.Live2DBackgrounds; 17 | import mindustry.game.EventType; 18 | 19 | import java.io.BufferedInputStream; 20 | import java.io.OutputStream; 21 | import java.net.HttpURLConnection; 22 | import java.net.URL; 23 | 24 | import static mindustry.Vars.*; 25 | 26 | public class ArchivDBackground implements Disposable { 27 | private static float l2dImportProg; 28 | static boolean cancel = false; 29 | static final String version = "v1.5"; 30 | static TextureRegion frame = new TextureRegion(); 31 | static Image animBG = new Image(frame); 32 | 33 | public static void buildL2D(String name) { 34 | // Nullable, can kill every mod with custom MenuRenderer 35 | try { 36 | if(!headless) { 37 | Live2DBackgrounds.LoadedL2D l2dLoaded = Live2DBackgrounds.getL2D(name); 38 | if (l2dLoaded.isSoundTrackLocal) { 39 | ArchiveDustry.recollectionMusic = tree.loadMusic(l2dLoaded.localSoundTrack); 40 | } else { 41 | ArchiveDustry.recollectionMusic = l2dLoaded.soundTrack; 42 | } 43 | Reflect.set(ui.menufrag, "renderer", null); 44 | Element tmp = ui.menuGroup.getChildren().first(); 45 | if (!(tmp instanceof Group group)) return; 46 | Element render = group.getChildren().first(); 47 | if (!(render.getClass().isAnonymousClass() 48 | && render.getClass().getEnclosingClass() == Group.class 49 | && render.getClass().getSuperclass() == Element.class)) return; 50 | render.visible = false; 51 | 52 | Events.on(EventType.ClientLoadEvent.class, e -> { 53 | animBG.setFillParent(true); 54 | group.addChildAt(0, animBG); 55 | Log.infoTag("ArchiveDustry", "Background Loaded!"); 56 | Timer timer = Timer.instance(); 57 | Timer.Task task = new Timer.Task() { 58 | @Override 59 | public void run() { 60 | //Log.infoTag("ArchivDebug", "Background Running...."); 61 | if(!state.isMenu()) this.cancel(); 62 | frame.set(l2dLoaded.loadedL2ds.get((int) (Time.globalTime / l2dLoaded.frameSpeed) % l2dLoaded.loadedL2ds.size)); 63 | animBG.getRegion().set(frame); 64 | } 65 | }; 66 | Events.run(EventType.Trigger.update, () -> { 67 | if (!state.isMenu()) { 68 | //failsafe if it is still running in 69 | //Log.infoTag("ArchivDebug", "Background stopped for real"); 70 | return; 71 | } 72 | if(state.isMenu() & timer.isEmpty() || !task.isScheduled()) timer.scheduleTask(task, 0, 0.001f); 73 | }); 74 | timer.scheduleTask(task, 0, 0.001f); 75 | }); 76 | } else { 77 | Log.infoTag("ArchiveDustry", "Headless detected! Background loading skipped."); 78 | } 79 | } catch (Exception error) { 80 | throw new RuntimeException(error); 81 | } 82 | } 83 | public static void downloadLive2D() { 84 | l2dImportProg = 0f; 85 | ui.loadfrag.show(); 86 | ui.loadfrag.setText(Core.bundle.get("l2dDownload")); 87 | ui.loadfrag.setProgress(() -> l2dImportProg); 88 | ui.loadfrag.setButton(() -> { 89 | cancel = true; 90 | ui.loadfrag.hide(); 91 | }); 92 | Http.get(ghApi + "/repos/WilloIzCitron/ArchiveDustryLive2DRepo/releases/latest", res -> { 93 | var json = Jval.read(res.getResultAsString()); 94 | var value = json.get("assets").asArray().find(v -> v.getString("name", "").startsWith("ArchivDLive2D-" + version + ".zip")); 95 | var downloadZip = value.getString("browser_download_url"); 96 | var dest = dataDirectory + "/live2dzip/"; 97 | var toDest = dataDirectory + "/live2d/"; 98 | download(downloadZip, new Fi(dest + "ArchivDLive2D-" + version + ".zip"), i -> l2dImportProg = i, () -> cancel, () -> { 99 | ui.loadfrag.setText(Core.bundle.get("l2dInstall")); 100 | unzip(dest + "ArchivDLive2D-" + version + ".zip", toDest); 101 | ui.loadfrag.setText(Core.bundle.get("l2dComplete")); 102 | ui.loadfrag.hide(); 103 | ui.showInfoFade(Core.bundle.get("l2dRestartRequired")); 104 | Core.settings.put("live2dinstalled", true); 105 | Fi.get(dest).deleteDirectory(); 106 | }); 107 | }, e -> ui.showException(e)); 108 | } 109 | 110 | private static void download(String furl, Fi dest, Floatc progressor, Boolp canceled, Runnable done) { 111 | mainExecutor.submit(() -> { 112 | try { 113 | HttpURLConnection con = (HttpURLConnection) new URL(furl).openConnection(); 114 | BufferedInputStream in = new BufferedInputStream(con.getInputStream()); 115 | OutputStream out = dest.write(false, 4096); 116 | 117 | byte[] data = new byte[4096]; 118 | long size = con.getContentLength(); 119 | long counter = 0; 120 | int x; 121 | while ((x = in.read(data, 0, data.length)) >= 0 && !canceled.get()) { 122 | counter += x; 123 | progressor.get((float) counter / (float) size); 124 | out.write(data, 0, x); 125 | } 126 | out.close(); 127 | in.close(); 128 | if (!canceled.get()) done.run(); 129 | } catch (Throwable e) { 130 | ui.showException(e); 131 | } 132 | }); 133 | } 134 | 135 | 136 | public static void unzip(String zipFile, String destFolder) { 137 | try { 138 | ZipFi zip = new ZipFi(Fi.get(zipFile)); 139 | zip.walk(c -> { 140 | Fi newDir = new Fi(destFolder+ "/" + c.path()); 141 | if(c.isDirectory()){ 142 | newDir.mkdirs(); 143 | } else { 144 | c.copyTo(newDir); 145 | } 146 | }); 147 | } catch (Exception e) { 148 | ui.showException(e); 149 | } 150 | } 151 | @Override 152 | public void dispose() { 153 | if (animBG.getRegion() != null && animBG.getRegion().texture != null) { 154 | animBG.getRegion().texture.getTextureData().disposePixmap(); 155 | animBG.getRegion().texture.dispose(); 156 | } 157 | } 158 | 159 | @Override 160 | public boolean isDisposed() { 161 | return Disposable.super.isDisposed(); 162 | } 163 | } -------------------------------------------------------------------------------- /src/bluearchive/ui/overrides/ArchivDLoadingFragment.java: -------------------------------------------------------------------------------- 1 | package bluearchive.ui.overrides; 2 | 3 | import arc.*; 4 | import arc.func.*; 5 | import arc.graphics.*; 6 | import arc.graphics.g2d.*; 7 | import arc.scene.*; 8 | import arc.scene.actions.*; 9 | import arc.scene.event.*; 10 | import arc.scene.ui.*; 11 | import arc.scene.ui.layout.*; 12 | import arc.util.Nullable; 13 | import mindustry.gen.*; 14 | import mindustry.graphics.*; 15 | import mindustry.ui.*; 16 | import mindustry.ui.fragments.*; 17 | import arc.math.*; 18 | 19 | import static mindustry.Vars.*; 20 | 21 | public class ArchivDLoadingFragment extends LoadingFragment { 22 | private Table table; 23 | private static TextButton button; 24 | private Bar bar; 25 | private static Label nameLabel; 26 | private float progValue; 27 | private Label tooltipTitle; 28 | private Label tooltipInfo; 29 | public static boolean loadFragShow; 30 | private static Table tabl; 31 | 32 | public static void init() { 33 | ui.loadfrag = new ArchivDLoadingFragment(); 34 | ui.loadfrag.build(Core.scene.root); 35 | } 36 | 37 | public void build(Group parent){ 38 | if(tabl == null) { 39 | tabl = new Table(table -> { 40 | nameLabel = table.add("@loading").color(Pal.techBlue).pad(10f).style(Styles.techLabel).left().get(); 41 | table.image(Tex.clear).growX(); 42 | button = table.button("@cancel", () -> { 43 | }).size(250f, 50f).visible(false).right().get(); 44 | updateLabel(false, "@loading"); 45 | }); 46 | } 47 | parent.fill(t -> { 48 | //rect must fill screen completely. 49 | t.rect((x, y, w, h) -> { 50 | Draw.alpha(t.color.a); 51 | Styles.black8.draw(0, 0, Core.graphics.getWidth(), Core.graphics.getHeight()); 52 | }); 53 | t.visible = false; 54 | t.touchable = Touchable.enabled; 55 | t.add().growY(); 56 | t.row(); 57 | t.table(a -> { 58 | tooltipTitle = a.add("Lorem Ipsum").color(Pal.techBlue).fontScale(1.5f).style(Styles.techLabel).pad(10).left().get(); 59 | a.row(); 60 | tooltipInfo = a.add("Line1\nline2\nline3\n").pad(10).left().get(); 61 | }).left().row(); 62 | t.add().growY(); 63 | t.row(); 64 | if(tabl != null) t.add(tabl).growX(); 65 | t.row(); 66 | t.table(a -> { 67 | a.add(new WarningBar()).color(Pal.techBlue).growX().height(24f).row(); 68 | bar = a.add(new Bar()).pad(3).padTop(6).height(40f).growX().visible(false).get(); 69 | }).bottom().growX().row(); 70 | table = t; 71 | }); 72 | } 73 | 74 | public void toFront(){ 75 | table.toFront(); 76 | } 77 | 78 | public void setProgress(Floatp progress){ 79 | bar.reset(0f); 80 | bar.visible = true; 81 | bar.set(() -> ((int)(progress.get() * 100) + "%"), progress, Pal.techBlue); 82 | } 83 | 84 | public void snapProgress(){ 85 | bar.snap(); 86 | } 87 | 88 | public void setProgress(float progress){ 89 | progValue = progress; 90 | if(!bar.visible){ 91 | setProgress(() -> progValue); 92 | } 93 | } 94 | 95 | public void setButton(Runnable listener){ 96 | button.visible = true; 97 | button.getListeners().remove(button.getListeners().size - 1); 98 | button.clicked(listener); 99 | } 100 | 101 | public void setText(String text){ 102 | updateLabel(false, text); 103 | nameLabel.setColor(Pal.accent); 104 | } 105 | 106 | public void show(){ 107 | tree.loadSound("chatMessage").play(); 108 | show("@loading"); 109 | } 110 | 111 | public void show(String text){ 112 | tree.loadSound("chatMessage").play(); 113 | button.visible = false; 114 | nameLabel.setColor(Color.white); 115 | tooltipTitle.setColor(Color.white); 116 | bar.visible = false; 117 | table.clearActions(); 118 | table.touchable = Touchable.enabled; 119 | updateLabel(false, text); 120 | updateLabel(true, null); 121 | table.visible = true; 122 | table.color.a = 1f; 123 | table.toFront(); 124 | loadFragShow = true; 125 | } 126 | 127 | public void hide(){ 128 | table.clearActions(); 129 | table.toFront(); 130 | table.touchable = Touchable.disabled; 131 | table.actions(Actions.fadeOut(0.5f), Actions.visible(false)); 132 | tabl = null; 133 | loadFragShow = false; 134 | } 135 | 136 | private void updateLabel(boolean isTooltip, @Nullable String text) { 137 | Label label = isTooltip ? tooltipTitle : nameLabel; 138 | label.setText(text); 139 | label.setColor(Pal.techBlue); 140 | 141 | CharSequence realText = label.getText(); 142 | for (int i = 0; i < realText.length(); i++) { 143 | if (Fonts.tech.getData().getGlyph(realText.charAt(i)) == null) { 144 | label.setStyle(Styles.defaultLabel); 145 | return; 146 | } 147 | } 148 | label.setStyle(Styles.techLabel); 149 | 150 | if (isTooltip) { 151 | int randomNum = Mathf.random(7); 152 | tooltipTitle.setText(Core.bundle.get("tooltipTitle-" + randomNum)); 153 | tooltipInfo.setText(Core.bundle.get("tooltipInfo-" + randomNum)); 154 | } 155 | } 156 | } 157 | 158 | -------------------------------------------------------------------------------- /src/bluearchive/ui/overrides/ArchivDMenu.java: -------------------------------------------------------------------------------- 1 | package bluearchive.ui.overrides; 2 | 3 | import arc.Core; 4 | import arc.scene.Group; 5 | import arc.scene.ui.Button; 6 | import arc.scene.ui.layout.Table; 7 | import arc.struct.Seq; 8 | import mindustry.graphics.MenuRenderer; 9 | import mindustry.ui.fragments.MenuFragment; 10 | 11 | import static mindustry.Vars.ui; 12 | 13 | public class ArchivDMenu extends MenuFragment { 14 | private Table container, submenu; 15 | private Button currentMenu; 16 | private MenuRenderer renderer; 17 | private Seq customButtons = new Seq<>(); 18 | public Seq desktopButtons = null; 19 | 20 | public static void init() { 21 | ui.menufrag = new ArchivDMenu(); 22 | ui.menufrag.build(Core.scene.root); 23 | } 24 | @Override 25 | public void build(Group parent) { 26 | renderer = new MenuRenderer(); 27 | super.build(parent); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/bluearchive/ui/overrides/ArchivDSettings.java: -------------------------------------------------------------------------------- 1 | package bluearchive.ui.overrides; 2 | 3 | import arc.Core; 4 | import arc.graphics.Color; 5 | import arc.scene.style.Drawable; 6 | import arc.scene.style.TextureRegionDrawable; 7 | import arc.scene.ui.ButtonGroup; 8 | import arc.scene.ui.Image; 9 | import arc.scene.ui.ImageButton; 10 | import arc.scene.ui.Label; 11 | import arc.scene.ui.layout.Cell; 12 | import arc.scene.utils.Elem; 13 | import arc.util.OS; 14 | import arc.util.Scaling; 15 | import bluearchive.ArchiveDustry; 16 | import bluearchive.ui.ArchivDUI; 17 | import bluearchive.ui.dialogs.ArchivDLive2DManager; 18 | import bluearchive.ui.dialogs.ArchivDLive2DSelectionDialog; 19 | import mindustry.Vars; 20 | import mindustry.gen.Icon; 21 | import mindustry.gen.Musics; 22 | import mindustry.gen.Tex; 23 | import mindustry.ui.Styles; 24 | import mindustry.ui.dialogs.SettingsMenuDialog; 25 | 26 | import java.time.LocalDate; 27 | import java.time.format.DateTimeFormatter; 28 | 29 | import static mindustry.Vars.tree; 30 | import static mindustry.Vars.ui; 31 | 32 | public class ArchivDSettings { 33 | public static float waveVolume; 34 | 35 | public static void loadSettings(){ 36 | ui.settings.addCategory("ArchiveDustry", t -> { 37 | t.center(); 38 | t.pref(new TextSeparator(Core.bundle.get("setting.category.general-setting"))); 39 | t.pref(new Separator(4)); 40 | t.pref(new Text(Core.bundle.get("setting.setSong.name"))); 41 | t.pref(new Text(Core.bundle.get("setting.setSong.description"))); 42 | t.pref(new Separator(4)); 43 | t.pref(new SongSelectSetting("setSong")); 44 | if(Core.settings.getBool("live2dinstalled", false)) { 45 | t.checkPref("enableL2D", false); 46 | } 47 | t.checkPref("ba-firstTime", true); 48 | t.checkPref("ba-addHalo", true); 49 | t.pref(new ButtonSetting("ba-downloadLive2D", Icon.download, ArchivDLive2DSelectionDialog::new, 32)); 50 | t.pref(new ButtonSetting(Core.bundle.get("ba-l2dManager"), Icon.settings, ArchivDLive2DManager::new, 32)); 51 | t.pref(new TextSeparator(Core.bundle.get("setting.category.unit-sound"))); 52 | t.pref(new Separator(3)); 53 | t.pref(new Text((LocalDate.now().format(DateTimeFormatter.ofPattern("dd-MM")).equals("01-04")) ? Core.bundle.get("setting.category.unit-sound.description") +"\n"+ Core.bundle.get("sussy") : Core.bundle.get("setting.category.unit-sound.description"))); 54 | t.pref(new Separator(3)); 55 | t.checkPref("HinaVoiceEnable", true); 56 | t.checkPref("ArisuVoiceEnable", true); 57 | t.pref(new TextSeparator(Core.bundle.get("setting.category.links"))); 58 | t.pref(new Separator(4)); 59 | t.pref(new ButtonSetting("ba-youtube", Icon.play, () -> Core.app.openURI("https://www.youtube.com/channel/UCsrnDYrkovQhCCE8kwKcvKQ"), 32)); 60 | t.pref(new ButtonSetting("ba-github", Icon.github, () -> Core.app.openURI("https://www.github.com/willoizcitron/archivedustry-java"), 32)); 61 | t.pref(new ButtonSetting(Core.bundle.get("credits"), Icon.info, ArchivDUI::showCredits, 32)); 62 | t.pref(new TextSeparator(Core.bundle.get("setting.category.mixer"))); 63 | t.pref(new Separator(4)); 64 | int defaultVolume = Core.settings.has("musicvol") ? Core.settings.getInt("musicvol") : (int) Core.settings.getDefault("musicvol"); 65 | t.sliderPref("gameOver", defaultVolume,0, 100,1,i -> { 66 | tree.loadMusic("win").setVolume(i / 100f); 67 | tree.loadMusic("lose").setVolume(i / 100f); 68 | return i + "%"; 69 | }); 70 | t.sliderPref("research", defaultVolume,0, 100,1,i -> { 71 | tree.loadMusic("research").setVolume(i / 100f); 72 | return i + "%"; 73 | }); 74 | t.sliderPref("coreDatabase", defaultVolume,0, 100,1,i -> { 75 | tree.loadMusic("database").setVolume(i / 100f); 76 | return i + "%"; 77 | }); 78 | t.sliderPref("loadout", defaultVolume,0, 100,1,i -> { 79 | tree.loadMusic("loadout").setVolume(i / 100f); 80 | return i + "%"; 81 | }); 82 | t.sliderPref("wave", defaultVolume,0, 100,1,i -> { 83 | waveVolume = i / 100f; 84 | return i + "%"; 85 | }); 86 | t.pref(new Separator(2)); 87 | if (OS.username.startsWith("willoizcitron")){ 88 | t.pref(new Separator(2)); 89 | t.pref(new TextSeparator("< Developer Settings >")); 90 | } 91 | t.pref(new Separator(2)); 92 | t.pref(new TextSeparator("< About >")); 93 | t.pref(new Separator(1)); 94 | t.pref(new ModInfo("bluearchive-logo", "bluearchive")); 95 | }); 96 | } 97 | 98 | /** Not a setting, but rather a button in the settings menu. */ 99 | static class ButtonSetting extends SettingsMenuDialog.SettingsTable.Setting { 100 | Drawable icon; 101 | Runnable listener; 102 | float iconSize; 103 | 104 | public ButtonSetting(String name, Drawable icon, Runnable listener, float iconSize){ 105 | super(name); 106 | this.icon = icon; 107 | this.listener = listener; 108 | this.iconSize = iconSize; 109 | } 110 | 111 | @Override 112 | public void add(SettingsMenuDialog.SettingsTable table){ 113 | ImageButton b = Elem.newImageButton(icon, listener); 114 | b.resizeImage(iconSize); 115 | b.label(() -> title).padLeft(6).growX(); 116 | b.left(); 117 | 118 | addDesc(table.add(b).left().padTop(3f).get()); 119 | table.row(); 120 | } 121 | } 122 | 123 | static class TextSeparator extends SettingsMenuDialog.SettingsTable.Setting { 124 | String text; 125 | public TextSeparator(String text){ 126 | super(""); 127 | this.text = text; 128 | } 129 | @Override 130 | public void add(SettingsMenuDialog.SettingsTable table){ 131 | Label b = new Label(text); 132 | b.setText(text); 133 | b.getStyle().background = Tex.underline; 134 | b.setAlignment(1); 135 | table.add(b).growX(); 136 | table.row(); 137 | } 138 | } 139 | 140 | static class Text extends SettingsMenuDialog.SettingsTable.Setting { 141 | String text; 142 | public Text(String text){ 143 | super(""); 144 | this.text = text; 145 | } 146 | @Override 147 | public void add(SettingsMenuDialog.SettingsTable table){ 148 | Label txt = new Label(text); 149 | txt.setText(text); 150 | txt.setAlignment(1); 151 | table.add(txt).growX(); 152 | table.row(); 153 | } 154 | } 155 | static class Separator extends SettingsMenuDialog.SettingsTable.Setting { 156 | float height; 157 | public Separator(float height){ 158 | super(""); 159 | this.height = height; 160 | } 161 | 162 | @Override 163 | public void add(SettingsMenuDialog.SettingsTable table){ 164 | table.image(Tex.clear).height(height).padTop(3f); 165 | table.row(); 166 | } 167 | } 168 | /** Not a setting, but rather adds an image to the settings menu. */ 169 | static class Banner extends SettingsMenuDialog.SettingsTable.Setting { 170 | float width; 171 | 172 | public Banner(String name, float width){ 173 | super(name); 174 | this.width = width; 175 | } 176 | 177 | @Override 178 | public void add(SettingsMenuDialog.SettingsTable table){ 179 | Image i = new Image(new TextureRegionDrawable(Core.atlas.find(name)), Scaling.fit); 180 | Cell ci = table.add(i).padTop(3f); 181 | 182 | if(width > 0){ 183 | ci.width(width); 184 | }else{ 185 | ci.grow(); 186 | } 187 | 188 | table.row(); 189 | } 190 | } 191 | static class ModInfo extends SettingsMenuDialog.SettingsTable.Setting { 192 | String modName; 193 | 194 | public ModInfo(String name, String modName){ 195 | super(name); 196 | this.modName = modName; 197 | } 198 | @Override 199 | public void add(SettingsMenuDialog.SettingsTable table) { 200 | Image i = new Image(new TextureRegionDrawable(Core.atlas.find(name)), Scaling.fit); 201 | Cell ci = table.add(i).padTop(3f); 202 | Label internalName = new Label(Vars.mods.getMod(modName).meta.internalName); 203 | internalName.setColor(Color.gray); 204 | internalName.setSize(1f); 205 | Label ver = new Label("Version: "+Vars.mods.getMod(modName).meta.version); 206 | Label author = new Label("Made by: "+Vars.mods.getMod(modName).meta.author); 207 | 208 | ci.size(500f, 250f); 209 | table.row(); 210 | table.add(internalName).row(); 211 | table.add(ver).row(); 212 | table.add(author).row(); 213 | } 214 | } 215 | static class SongSelectSetting extends SettingsMenuDialog.SettingsTable.Setting { 216 | public SongSelectSetting(String name){ 217 | super("Song Select"); 218 | } 219 | @Override 220 | public void add(SettingsMenuDialog.SettingsTable settingsTable) { 221 | // Must be hardcoded because there's no new thing here 222 | settingsTable.table(Tex.button, t -> { 223 | t.margin(10f); 224 | var group = new ButtonGroup<>(); 225 | var style = Styles.flatBordert; 226 | 227 | t.defaults().size(160f, 60f); 228 | t.button(Core.bundle.get("ba-music1.name"), style, () -> { 229 | Musics.menu = tree.loadMusic("menucm"); 230 | Core.settings.put("selectedSong", "menucm"); 231 | }).group(group).checked(b -> Core.settings.getString("selectedSong").equals("menucm")); 232 | t.button(Core.bundle.get("ba-music2.name"), style, () -> { 233 | Musics.menu = tree.loadMusic("menure-aoh"); 234 | Core.settings.put("selectedSong", "menure-aoh"); 235 | }).group(group).checked(b -> Core.settings.getString("selectedSong").equals("menucm")); 236 | if(Core.settings.getBool("enableL2D")) { 237 | t.button(Core.bundle.get("ba-music3.name"), style, () -> { 238 | Musics.menu = ArchiveDustry.recollectionMusic; 239 | Core.settings.put("selectedSong", "recollection"); 240 | }).group(group).checked(b -> Core.settings.getString("selectedSong").equals("recollection")); 241 | } 242 | t.row(); 243 | }).row(); 244 | } 245 | } 246 | } 247 | --------------------------------------------------------------------------------