├── .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 | 
3 |
4 | [](https://github.com/WilloIzCitron/ArchiveDustry-Java/actions?query=workflow:"Build+Mod")
5 | [](https://github.com/WilloIzCitron/ArchiveDustry-Java/releases/)
6 | [](https://github.com/WilloIzCitron/ArchiveDustry-Java/blob/master/LICENSE)
7 | [](https://github.com/WilloIzCitron/ArchiveDustry-Java/issues)
8 | [](https://github.com/WilloIzCitron/ArchiveDustry-Java/stargazers)
9 | [](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 |
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 | 
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 | 
3 |
4 | [](https://github.com/WilloIzCitron/ArchiveDustry-Java/actions?query=workflow:"Build+Mod")
5 | [](https://github.com/WilloIzCitron/ArchiveDustry-Java/releases/)
6 | [](https://github.com/WilloIzCitron/ArchiveDustry-Java/blob/master/LICENSE)
7 | [](https://github.com/WilloIzCitron/ArchiveDustry-Java/issues)
8 | [](https://github.com/WilloIzCitron/ArchiveDustry-Java/stargazers)
9 | [](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 | 
3 |
4 | [](https://github.com/WilloIzCitron/ArchiveDustry-Java/actions?query=workflow:"Build+Mod")
5 | [](https://github.com/WilloIzCitron/ArchiveDustry-Java/releases/)
6 | [](https://github.com/WilloIzCitron/ArchiveDustry-Java/blob/master/LICENSE)
7 | [](https://github.com/WilloIzCitron/ArchiveDustry-Java/issues)
8 | [](https://github.com/WilloIzCitron/ArchiveDustry-Java/stargazers)
9 | [](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 | 
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 | 
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 |
--------------------------------------------------------------------------------