├── .github └── workflows │ ├── gradle.yml │ └── pr.yml ├── .gitignore ├── LICENSE ├── README.md ├── assets ├── bundles │ └── bundle.properties ├── generated.msav ├── maps │ └── generated.msav └── sprites │ ├── blocks │ ├── effect │ │ ├── miniCore-team-crux.png │ │ ├── miniCore-team-sharded.png │ │ ├── miniCore-team.png │ │ ├── miniCore.png │ │ ├── statusEffectProjector.png │ │ └── tesla.png │ ├── factories │ │ └── lonsdaleite-compressor │ │ │ ├── lonsdaleite-compressor-bottom.png │ │ │ ├── lonsdaleite-compressor-frame0.png │ │ │ ├── lonsdaleite-compressor-frame1.png │ │ │ ├── lonsdaleite-compressor-frame2.png │ │ │ ├── lonsdaleite-compressor-frame3.png │ │ │ ├── lonsdaleite-compressor-top.png │ │ │ └── lonsdaleite-compressor.png │ ├── turrets │ │ ├── bases │ │ │ ├── block-5.png │ │ │ ├── block-6.png │ │ │ └── block-7.png │ │ ├── praefector.png │ │ └── vilicus.png │ └── walls │ │ ├── lonsdaleiteWall.png │ │ └── lonsdaleiteWallLarge.png │ ├── effects │ ├── swordBullet-0.png │ ├── swordBullet-1.png │ ├── swordBullet-2.png │ ├── swordBullet-3.png │ ├── swordBullet-4.png │ ├── swordBullet-back-0.png │ ├── swordBullet-back-1.png │ ├── swordBullet-back-2.png │ ├── swordBullet-back-3.png │ ├── swordBullet-back-4.png │ ├── swordBullet-back.png │ └── swordBullet.png │ ├── frog.png │ ├── items │ └── lonsdaleite.png │ ├── status │ ├── shieldBreak.png │ └── shielded.png │ ├── units │ ├── aranea-full.png │ ├── aranea-outline.png │ ├── aranea.png │ ├── eterius-cell.png │ ├── eterius-full.png │ ├── eterius-laser-heat.png │ ├── eterius.png │ ├── inductor-cell.png │ ├── inductor-foot.png │ ├── inductor-full.png │ ├── inductor-joint.png │ ├── inductor-leg-base.png │ ├── inductor-leg.png │ ├── inductor-outline.png │ ├── inductor.png │ ├── interitus-cell.png │ ├── interitus-full.png │ ├── interitus-outline.png │ ├── interitus.png │ ├── lucius-base.png │ ├── lucius-cell.png │ ├── lucius-full.png │ ├── lucius-leg.png │ ├── lucius-outline.png │ ├── lucius.png │ ├── machaera-base.png │ ├── machaera-cell.png │ ├── machaera-full.png │ ├── machaera-leg.png │ ├── machaera-outline.png │ ├── machaera.png │ ├── mucro-base.png │ ├── mucro-cell.png │ ├── mucro-full.png │ ├── mucro-leg.png │ ├── mucro-outline.png │ ├── mucro.png │ ├── princeps-base.png │ ├── princeps-cell.png │ ├── princeps-full.png │ ├── princeps-leg.png │ ├── princeps-outline.png │ ├── princeps.png │ ├── procurator-base.png │ ├── procurator-cell.png │ ├── procurator-full.png │ ├── procurator-leg.png │ ├── procurator-outline.png │ ├── procurator.png │ ├── pugione-base.png │ ├── pugione-cell.png │ ├── pugione-full.png │ ├── pugione-leg.png │ ├── pugione-outline.png │ ├── pugione.png │ ├── spiculum-cell.png │ ├── spiculum-full.png │ ├── spiculum-outline.png │ ├── spiculum.png │ ├── tragula-base.png │ ├── tragula-cell.png │ ├── tragula-full.png │ ├── tragula-leg.png │ ├── tragula-outline.png │ ├── tragula.png │ ├── traho-cell.png │ ├── traho-full.png │ ├── traho-outline.png │ └── traho.png │ └── weapons │ ├── eteriusArtillery-outline.png │ ├── eteriusArtillery.png │ ├── eteriusLaser-heat.png │ ├── eteriusLaser-outline.png │ ├── eteriusLaser.png │ ├── inductorArtillery-outline.png │ ├── inductorArtillery.png │ ├── inductorShotgun-outline.png │ ├── inductorShotgun.png │ ├── interitusArtillery-outline.png │ ├── interitusArtillery.png │ ├── luciusWeapon-outline.png │ ├── luciusWeapon.png │ ├── machaeraWeapon-outline.png │ ├── machaeraWeapon.png │ ├── mucroWeapon-outline.png │ ├── mucroWeapon.png │ ├── princepsWeapon-outline.png │ ├── princepsWeapon.png │ ├── procuratorWeapon-outline.png │ ├── procuratorWeapon.png │ ├── pugioneWeapon-outline.png │ ├── pugioneWeapon.png │ ├── tragulaWeapon-outline.png │ ├── tragulaWeapon.png │ ├── trahoWeapon-outline.png │ └── trahoWeapon.png ├── build.gradle ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── mod.hjson └── src └── heav ├── HeavyMachineryJava.java ├── ai └── types │ └── DisabledPredictAi.java ├── content ├── HMBlocks.java ├── HMBullets.java ├── HMFx.java ├── HMItems.java ├── HMPlanets.java ├── HMSectorPresents.java ├── HMStatusEffects.java ├── HMTechTree.java └── HMUnits.java ├── entities ├── abilities │ └── LaserMoveAbility.java └── bullet │ ├── GroundSpikeBulletType.java │ ├── OrbiterBulletType.java │ ├── OverseerBulletType.java │ ├── PortalBulletType.java │ ├── RandSpriteBulletType.java │ └── RayBulletType.java ├── maps └── CaeruleumPlanetGenerator.java ├── type └── ShieldStatusEffect.java ├── util ├── HMDraw.java └── HMFunc.java └── world ├── blocks └── defense │ ├── DRWall.java │ ├── StatusEffectProjector.java │ ├── Tesla.java │ └── turrets │ ├── DisabledPredictTurret.java │ └── FractalTurret.java └── meta └── HMStatValues.java /.github/workflows/gradle.yml: -------------------------------------------------------------------------------- 1 | name: Build Mod 2 | 3 | on: [push, pull_request] 4 | 5 | jobs: 6 | buildJar: 7 | runs-on: ubuntu-latest 8 | 9 | steps: 10 | - uses: actions/checkout@v2 11 | - name: Set up PATH 12 | run: | 13 | echo "${ANDROID_HOME}/build-tools/34.0.0" >> $GITHUB_PATH 14 | - name: Set up JDK 17 15 | uses: actions/setup-java@v1 16 | with: 17 | java-version: 17 18 | - name: Build mod jar 19 | run: | 20 | chmod +x ./gradlew 21 | ./gradlew deploy 22 | - name: Upload built jar file 23 | uses: actions/upload-artifact@v4 24 | with: 25 | name: ${{ github.event.repository.name }} 26 | path: build/libs/${{ github.event.repository.name }}.jar 27 | -------------------------------------------------------------------------------- /.github/workflows/pr.yml: -------------------------------------------------------------------------------- 1 | name: Pr test 2 | 3 | on: [pull_request, workflow_dispatch] 4 | 5 | jobs: 6 | buildJar: 7 | runs-on: ubuntu-latest 8 | 9 | steps: 10 | - uses: actions/checkout@v1 11 | - name: Set up PATH 12 | run: | 13 | echo "${ANDROID_HOME}/build-tools/30.0.1" >> $GITHUB_PATH 14 | - name: Set up JDK 16 15 | uses: actions/setup-java@v1 16 | with: 17 | java-version: 16 18 | - name: Build mod jar 19 | run: chmod +x ./gradlew && ./gradlew deploy 20 | - name: Upload built jar file 21 | uses: actions/upload-artifact@v2 22 | with: 23 | name: ${{ github.event.repository.name }} 24 | path: build/libs/${{ github.event.repository.name }}.jar 25 | -------------------------------------------------------------------------------- /.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 | 49 | ## Robovm 50 | /ios/robovm-build/ 51 | 52 | ## GWT 53 | /html/war/ 54 | /html/gwt-unitCache/ 55 | .apt_generated/ 56 | .gwt/ 57 | gwt-unitCache/ 58 | www-test/ 59 | .gwt-tmp/ 60 | 61 | ## Android Studio and Intellij and Android in general 62 | /android/libs/armeabi/ 63 | /android/libs/armeabi-v7a/ 64 | /android/libs/arm64-v8a/ 65 | /android/libs/x86/ 66 | /android/libs/x86_64/ 67 | /android/gen/ 68 | .idea/ 69 | *.ipr 70 | *.iws 71 | *.iml 72 | /android/out/ 73 | com_crashlytics_export_strings.xml 74 | 75 | ## Eclipse 76 | 77 | .classpath 78 | .project 79 | .metadata/ 80 | /android/bin/ 81 | /core/bin/ 82 | /desktop/bin/ 83 | /html/bin/ 84 | /ios/bin/ 85 | /ios-moe/bin/ 86 | *.tmp 87 | *.bak 88 | *.swp 89 | *~.nib 90 | .settings/ 91 | .loadpath 92 | .externalToolBuilders/ 93 | *.launch 94 | 95 | ## NetBeans 96 | 97 | /nbproject/private/ 98 | /android/nbproject/private/ 99 | /core/nbproject/private/ 100 | /desktop/nbproject/private/ 101 | /html/nbproject/private/ 102 | /ios/nbproject/private/ 103 | /ios-moe/nbproject/private/ 104 | 105 | /build/ 106 | /android/build/ 107 | /core/build/ 108 | /desktop/build/ 109 | /html/build/ 110 | /ios/build/ 111 | /ios-moe/build/ 112 | 113 | /nbbuild/ 114 | /android/nbbuild/ 115 | /core/nbbuild/ 116 | /desktop/nbbuild/ 117 | /html/nbbuild/ 118 | /ios/nbbuild/ 119 | /ios-moe/nbbuild/ 120 | 121 | /dist/ 122 | /android/dist/ 123 | /core/dist/ 124 | /desktop/dist/ 125 | /html/dist/ 126 | /ios/dist/ 127 | /ios-moe/dist/ 128 | 129 | /nbdist/ 130 | /android/nbdist/ 131 | /core/nbdist/ 132 | /desktop/nbdist/ 133 | /html/nbdist/ 134 | /ios/nbdist/ 135 | /ios-moe/nbdist/ 136 | 137 | nbactions.xml 138 | nb-configuration.xml 139 | 140 | ## Gradle 141 | 142 | /local.properties 143 | .gradle/ 144 | gradle-app.setting 145 | /build/ 146 | /android/build/ 147 | /core/build/ 148 | /desktop/build/ 149 | /html/build/ 150 | /ios/build/ 151 | /ios-moe/build/ 152 | 153 | ## OS Specific 154 | .DS_Store 155 | Thumbs.db 156 | android/libs/ 157 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Icon](https://github.com/Zeniku/HeavyMachinery/blob/main/icon.png)
2 | 3 | [![GitHub](https://img.shields.io/github/license/Zeniku/HeavyMachineryJava?color=success&label=License&logo=github&style=flat-square)](https://github.com/Zeniku/HeavyMachineryJava/blob/master/LICENSE) 4 | [![Hits](https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2FZenike%2FHeavyMachineryJava&count_bg=%2379C83D&title_bg=%23555555&icon=codeforces.svg&icon_color=%23E7E7E7&title=visitors&edge_flat=true)](https://hits.seeyoufarm.com) 5 | [![Stars](https://img.shields.io/github/stars/Zeniku/HeavyMachineryJava?label=Star%20this%20Mod%21&style=social)](https://github.com/Zeniku/HeavyMachineryJava/blob/master) 6 | 7 | ## HeavyMachineryJava 8 | A Java Mindustry mod ported from js to java 9 | 10 |
Other Stuff 11 | 12 | - **Wiki:** https://github.com/Zeniku/HeavyMachinery-Wiki 13 | - **JS:** https://github.com/Zeniku/HeavyMachinery 14 |
15 | 16 | 17 | **Adds:** 18 |
19 | 20 | *Units: 11* 21 | - Melee: 5 22 | - PurpleAir: 5 23 | - Overseer: 3 24 | 25 | *Blocks: 5* 26 | - Turrets: 2 27 | - Effects: 3 28 | - Production: 1 29 |
30 | 31 | ### Notes 32 | This Mod is deprecated 33 | go to [Caerulem](https://github/Zeniku/Caerulem) instead 34 | There is a lot planned on this mod but not out yet so keep watch for new updates
35 | All things on `Adds` is subject to change 36 | 37 | Thanks you to [Shit Fabric](https://github.com/Duvent-mindustry) For the Awesome Logo! 38 | 39 | ## Contribute 40 | 41 | **For Bugs and issues you may report them To:** 42 | 1. [My Discord Sever](https://discord.gg/bWBGyty) 43 | 2. [Github's Issues](https://github.com/Zeniku/HeavyMachineryJava/issues) 44 | 45 | **For Contribution and ideas** 46 | 1. [My Discord Sever](https://discord.gg/bWBGyty) 47 | 2. [Github's PullRequest](https://github.com/Zeniku/HeavyMachineryJava/pulls) 48 | 49 | ## Maintainers 50 | ### Owner 51 | Github: [Zeniku](https://github.com/Zeniku)
52 | Discord: `Zeniku/HeavyMachinery#1408` 53 | 54 | ### Contributors 55 | 56 | 1. **Shit Fabric** 57 | - Github: [Shit Fabric](https://github.com/Duvent-mindustry) 58 | - Discord: `Shit Fabric#6688` 59 | 2. **Broad** 60 | - Github: [Broad](https://github.com/Br0ad) 61 | - Discord: `Ɓroad#0648` 62 | 63 | --- 64 |
65 |

Building

66 | 67 | ### Building for Desktop Testing 68 | 69 | 1. Install JDK **16**. 70 | 2. Run `gradlew jar` [1]. 71 | 3. Your mod jar will be in the `build/libs` directory. **Only use this version for testing on desktop. It will not work with Android.** 72 | To build an Android-compatible version, you need the Android SDK. You can either let Github Actions handle this, or set it up yourself. See steps below. 73 | 74 | ### Building through Github Actions 75 | 76 | This repository is set up with Github Actions CI to automatically build the mod for you every commit. This requires a Github repository, for obvious reasons. 77 | To get a jar file that works for every platform, do the following: 78 | 1. Make a Github repository with your mod name, and upload the contents of this repo to it. Perform any modifications necessary, then commit and push. 79 | 2. Check the "Actions" tab on your repository page. Select the most recent commit in the list. If it completed successfully, there should be a download link under the "Artifacts" section. 80 | 3. Click the download link (should be the name of your repo). This will download a **zipped jar** - **not** the jar file itself [2]! Unzip this file and import the jar contained within in Mindustry. This version should work both on Android and Desktop. 81 | 82 | ### Building Locally 83 | 84 | Building locally takes more time to set up, but shouldn't be a problem if you've done Android development before. 85 | 1. Download the Android SDK, unzip it and set the `ANDROID_HOME` environment variable to its location. 86 | 2. Make sure you have API level 30 installed, as well as any recent version of build tools (e.g. 30.0.1) 87 | 3. Add a build-tools folder to your PATH. For example, if you have `30.0.1` installed, that would be `$ANDROID_HOME/build-tools/30.0.1`. 88 | 4. Run `gradlew deploy`. If you did everything correctlly, this will create a jar file in the `build/libs` directory that can be run on both Android and desktop. 89 | 90 | --- 91 | 92 | *[1]* *On Linux/Mac it's `./gradlew`, but if you're using Linux I assume you know how to run executables properly anyway.* 93 | *[2]: Yes, I know this is stupid. It's a Github UI limitation - while the jar itself is uploaded unzipped, there is currently no way to download it as a single file.* 94 |
95 | -------------------------------------------------------------------------------- /assets/bundles/bundle.properties: -------------------------------------------------------------------------------- 1 | //[Things] 2 | yes.yes = Yes 3 | 4 | status.maxShield = Max Shield 5 | status.shieldAmount = Shield Amount 6 | status.shieldRemoved = Shield Removed 7 | 8 | //[Items] 9 | item.heavymachineryjava-lonsdaleite.name = Lonsdaleite 10 | item.heavymachineryjava-lonsdaleite.description = Used in blocks introduced in Heavy Machinery mod.\nExtremely resistant to pressure. 11 | item.heavymachineryjava-ignisium.name = Ignisium 12 | item.heavymachineryjava-ignisium.description = Hidden item, only obtainable via item sources, [red]for now[]. 13 | 14 | //[Blocks] 15 | 16 | //Crafting 17 | block.heavymachineryjava-lonsdaleite-compressor.name = Lonsdaleite Compressor 18 | block.heavymachineryjava-lonsdaleite-compressor.description = Processes and compresses graphite to lonsdaleite 19 | 20 | //(Effect) 21 | block.heavymachineryjava-statusEffectProjector.name = Status Effect Projector 22 | block.heavymachineryjava-statusEffectProjector.description = Inflicts buffs and debuffs on corresponding team units. 23 | block.heavymachineryjava-statusEffectProjector.details = Enemies like them… S H O U L D B E [red]B U R N I N G I N H E L L[] 24 | 25 | block.heavymachineryjava-tesla.name = Tesla 26 | block.heavymachineryjava-tesla.description = Electrocutes units. 27 | 28 | //(Storage) 29 | block.heavymachineryjava-miniCore.name = Mini Core 30 | block.heavymachineryjava-miniCore.description = The Mini Core can be built anywhere but it can't be destroyed. 31 | block.heavymachineryjava-miniCore.details = Acropolis is underrated, vote for Mini Core instead. 32 | 33 | //(Turrets) 34 | block.heavymachineryjava-praefector.name = Praefector 35 | block.heavymachineryjava-praefector.description = Shoots bullets that follow the cursor whenever controlled by the player. 36 | block.heavymachineryjava-heavenlyStrike.name = Heavenly Strike 37 | block.heavymachineryjava-heavenlyStrike.description = Bombards enemies with swords from evey direction. 38 | 39 | //(Defense) 40 | block.heavymachineryjava-lonsdaleiteWall.name = Lonsdaleite Wall 41 | block.heavymachineryjava-lonsdaleiteWall.description = Protects structures from enemy projectiles. Reduces bullet damage on impact. 42 | block.heavymachineryjava-lonsdaleiteWallLarge.name = Large Lonsdaleite Wall 43 | block.heavymachineryjava-lonsdaleiteWallLarge.description = Protects structures from enemy projectiles. Reduces bullet damage on impact. 44 | 45 | //[Ground units] 46 | 47 | //Melee 48 | unit.heavymachineryjava-pugione.name = Pugione 49 | unit.heavymachineryjava-pugione.description = Punches enemies, damaging them. 50 | unit.heavymachineryjava-pugione.details = We are the angels of death. 51 | unit.heavymachineryjava-mucro.name = Mucro 52 | unit.heavymachineryjava-mucro.description = A Melee Unit that punches multiple times. 53 | unit.heavymachineryjava-tragula.name = Tragula 54 | unit.heavymachineryjava-tragula.description = A Melee Unit that punches long spikes through enemy structures. 55 | unit.heavymachineryjava-tragula.details = we do do a little trolling, it's called we do do a little trolling. 56 | 57 | unit.heavymachineryjava-lucius.name = Lucius 58 | unit.heavymachineryjava-lucius.description = A Melee Unit that can summon spikes from the ground. 59 | unit.heavymachineryjava-lucius.details = What is thi- AHHH! 60 | 61 | unit.heavymachineryjava-machaera.name = Machaera 62 | unit.heavymachineryjava-machaera.description = A Melee unit that can summon spikes from the ground. 63 | unit.heavymachineryjava-machaera.details = SKULLS FOR THE SKULL THRONE! 64 | 65 | //Overseer 66 | unit.heavymachineryjava-princeps.name = Princeps 67 | unit.heavymachineryjava-princeps.description = A basic Overseer Unit. 68 | unit.heavymachineryjava-princeps.details = Okay, where should I go? I'm so confused. 69 | 70 | unit.heavymachineryjava-procurator.name = Procurator 71 | unit.heavymachineryjava-procurator.description = An Overseer Unit. 72 | unit.heavymachineryjava-inductor.name = Inductor 73 | unit.heavymachineryjava-inductor.description = A Spider Unit that can control its bullets. 74 | unit.heavymachineryjava-inductor.details = death is approaching quickly, run 75 | 76 | //Purple Air 77 | unit.heavymachineryjava-aranea.name = Aranea 78 | unit.heavymachineryjava-aranea.description = A Flying unit that explodes. 79 | unit.heavymachineryjava-aranea.details = crawler but he flying grr 80 | unit.heavymachineryjava-traho.name = Traho 81 | unit.heavymachineryjava-traho.description = A Flying unit that pulls in enemy units. 82 | unit.heavymachineryjava-traho.details = Come here you coward! 83 | unit.heavymachineryjava-spiculum.name = Spiculum 84 | unit.heavymachineryjava-spiculum.description = A Flying unit that shoots lasers when it moves. 85 | unit.heavymachineryjava-spiculum.details = *lightsaber noises* 86 | unit.heavymachineryjava-interitus.name = Interitus 87 | unit.heavymachineryjava-interitus.description = A Flying unit that has a cannon. 88 | unit.heavymachineryjava-interitus.details = boom 89 | unit.heavymachineryjava-eterius.name = Eterius 90 | unit.heavymachineryjava-eterius.description = A Flying unit that has a laser 91 | unit.heavymachineryjava-eterius.details = IMMA FIRIN MAH LAZAR! 92 | 93 | //[Status] 94 | 95 | status.heavymachineryjava-shielded.name = Shielded 96 | status.heavymachineryjava-shielded.description = Grants the unit a shield 97 | statis.heavymachineryjava-shielded.details = hi unit you deserve to be shielded 98 | status.heavymachineryjava-shieldBreak.name = Shield Break 99 | status.heavymachineryjava-shieldBreak.description = Destroys the unit's shield. 100 | status.heavymachineryjava-shieldbreak.details = *shows middle finger* 101 | -------------------------------------------------------------------------------- /assets/generated.msav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/generated.msav -------------------------------------------------------------------------------- /assets/maps/generated.msav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/maps/generated.msav -------------------------------------------------------------------------------- /assets/sprites/blocks/effect/miniCore-team-crux.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/blocks/effect/miniCore-team-crux.png -------------------------------------------------------------------------------- /assets/sprites/blocks/effect/miniCore-team-sharded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/blocks/effect/miniCore-team-sharded.png -------------------------------------------------------------------------------- /assets/sprites/blocks/effect/miniCore-team.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/blocks/effect/miniCore-team.png -------------------------------------------------------------------------------- /assets/sprites/blocks/effect/miniCore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/blocks/effect/miniCore.png -------------------------------------------------------------------------------- /assets/sprites/blocks/effect/statusEffectProjector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/blocks/effect/statusEffectProjector.png -------------------------------------------------------------------------------- /assets/sprites/blocks/effect/tesla.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/blocks/effect/tesla.png -------------------------------------------------------------------------------- /assets/sprites/blocks/factories/lonsdaleite-compressor/lonsdaleite-compressor-bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/blocks/factories/lonsdaleite-compressor/lonsdaleite-compressor-bottom.png -------------------------------------------------------------------------------- /assets/sprites/blocks/factories/lonsdaleite-compressor/lonsdaleite-compressor-frame0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/blocks/factories/lonsdaleite-compressor/lonsdaleite-compressor-frame0.png -------------------------------------------------------------------------------- /assets/sprites/blocks/factories/lonsdaleite-compressor/lonsdaleite-compressor-frame1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/blocks/factories/lonsdaleite-compressor/lonsdaleite-compressor-frame1.png -------------------------------------------------------------------------------- /assets/sprites/blocks/factories/lonsdaleite-compressor/lonsdaleite-compressor-frame2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/blocks/factories/lonsdaleite-compressor/lonsdaleite-compressor-frame2.png -------------------------------------------------------------------------------- /assets/sprites/blocks/factories/lonsdaleite-compressor/lonsdaleite-compressor-frame3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/blocks/factories/lonsdaleite-compressor/lonsdaleite-compressor-frame3.png -------------------------------------------------------------------------------- /assets/sprites/blocks/factories/lonsdaleite-compressor/lonsdaleite-compressor-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/blocks/factories/lonsdaleite-compressor/lonsdaleite-compressor-top.png -------------------------------------------------------------------------------- /assets/sprites/blocks/factories/lonsdaleite-compressor/lonsdaleite-compressor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/blocks/factories/lonsdaleite-compressor/lonsdaleite-compressor.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turrets/bases/block-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/blocks/turrets/bases/block-5.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turrets/bases/block-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/blocks/turrets/bases/block-6.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turrets/bases/block-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/blocks/turrets/bases/block-7.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turrets/praefector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/blocks/turrets/praefector.png -------------------------------------------------------------------------------- /assets/sprites/blocks/turrets/vilicus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/blocks/turrets/vilicus.png -------------------------------------------------------------------------------- /assets/sprites/blocks/walls/lonsdaleiteWall.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/blocks/walls/lonsdaleiteWall.png -------------------------------------------------------------------------------- /assets/sprites/blocks/walls/lonsdaleiteWallLarge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/blocks/walls/lonsdaleiteWallLarge.png -------------------------------------------------------------------------------- /assets/sprites/effects/swordBullet-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/effects/swordBullet-0.png -------------------------------------------------------------------------------- /assets/sprites/effects/swordBullet-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/effects/swordBullet-1.png -------------------------------------------------------------------------------- /assets/sprites/effects/swordBullet-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/effects/swordBullet-2.png -------------------------------------------------------------------------------- /assets/sprites/effects/swordBullet-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/effects/swordBullet-3.png -------------------------------------------------------------------------------- /assets/sprites/effects/swordBullet-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/effects/swordBullet-4.png -------------------------------------------------------------------------------- /assets/sprites/effects/swordBullet-back-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/effects/swordBullet-back-0.png -------------------------------------------------------------------------------- /assets/sprites/effects/swordBullet-back-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/effects/swordBullet-back-1.png -------------------------------------------------------------------------------- /assets/sprites/effects/swordBullet-back-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/effects/swordBullet-back-2.png -------------------------------------------------------------------------------- /assets/sprites/effects/swordBullet-back-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/effects/swordBullet-back-3.png -------------------------------------------------------------------------------- /assets/sprites/effects/swordBullet-back-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/effects/swordBullet-back-4.png -------------------------------------------------------------------------------- /assets/sprites/effects/swordBullet-back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/effects/swordBullet-back.png -------------------------------------------------------------------------------- /assets/sprites/effects/swordBullet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/effects/swordBullet.png -------------------------------------------------------------------------------- /assets/sprites/frog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/frog.png -------------------------------------------------------------------------------- /assets/sprites/items/lonsdaleite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/items/lonsdaleite.png -------------------------------------------------------------------------------- /assets/sprites/status/shieldBreak.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/status/shieldBreak.png -------------------------------------------------------------------------------- /assets/sprites/status/shielded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/status/shielded.png -------------------------------------------------------------------------------- /assets/sprites/units/aranea-full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/aranea-full.png -------------------------------------------------------------------------------- /assets/sprites/units/aranea-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/aranea-outline.png -------------------------------------------------------------------------------- /assets/sprites/units/aranea.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/aranea.png -------------------------------------------------------------------------------- /assets/sprites/units/eterius-cell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/eterius-cell.png -------------------------------------------------------------------------------- /assets/sprites/units/eterius-full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/eterius-full.png -------------------------------------------------------------------------------- /assets/sprites/units/eterius-laser-heat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/eterius-laser-heat.png -------------------------------------------------------------------------------- /assets/sprites/units/eterius.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/eterius.png -------------------------------------------------------------------------------- /assets/sprites/units/inductor-cell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/inductor-cell.png -------------------------------------------------------------------------------- /assets/sprites/units/inductor-foot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/inductor-foot.png -------------------------------------------------------------------------------- /assets/sprites/units/inductor-full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/inductor-full.png -------------------------------------------------------------------------------- /assets/sprites/units/inductor-joint.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/inductor-joint.png -------------------------------------------------------------------------------- /assets/sprites/units/inductor-leg-base.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/inductor-leg-base.png -------------------------------------------------------------------------------- /assets/sprites/units/inductor-leg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/inductor-leg.png -------------------------------------------------------------------------------- /assets/sprites/units/inductor-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/inductor-outline.png -------------------------------------------------------------------------------- /assets/sprites/units/inductor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/inductor.png -------------------------------------------------------------------------------- /assets/sprites/units/interitus-cell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/interitus-cell.png -------------------------------------------------------------------------------- /assets/sprites/units/interitus-full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/interitus-full.png -------------------------------------------------------------------------------- /assets/sprites/units/interitus-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/interitus-outline.png -------------------------------------------------------------------------------- /assets/sprites/units/interitus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/interitus.png -------------------------------------------------------------------------------- /assets/sprites/units/lucius-base.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/lucius-base.png -------------------------------------------------------------------------------- /assets/sprites/units/lucius-cell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/lucius-cell.png -------------------------------------------------------------------------------- /assets/sprites/units/lucius-full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/lucius-full.png -------------------------------------------------------------------------------- /assets/sprites/units/lucius-leg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/lucius-leg.png -------------------------------------------------------------------------------- /assets/sprites/units/lucius-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/lucius-outline.png -------------------------------------------------------------------------------- /assets/sprites/units/lucius.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/lucius.png -------------------------------------------------------------------------------- /assets/sprites/units/machaera-base.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/machaera-base.png -------------------------------------------------------------------------------- /assets/sprites/units/machaera-cell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/machaera-cell.png -------------------------------------------------------------------------------- /assets/sprites/units/machaera-full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/machaera-full.png -------------------------------------------------------------------------------- /assets/sprites/units/machaera-leg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/machaera-leg.png -------------------------------------------------------------------------------- /assets/sprites/units/machaera-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/machaera-outline.png -------------------------------------------------------------------------------- /assets/sprites/units/machaera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/machaera.png -------------------------------------------------------------------------------- /assets/sprites/units/mucro-base.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/mucro-base.png -------------------------------------------------------------------------------- /assets/sprites/units/mucro-cell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/mucro-cell.png -------------------------------------------------------------------------------- /assets/sprites/units/mucro-full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/mucro-full.png -------------------------------------------------------------------------------- /assets/sprites/units/mucro-leg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/mucro-leg.png -------------------------------------------------------------------------------- /assets/sprites/units/mucro-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/mucro-outline.png -------------------------------------------------------------------------------- /assets/sprites/units/mucro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/mucro.png -------------------------------------------------------------------------------- /assets/sprites/units/princeps-base.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/princeps-base.png -------------------------------------------------------------------------------- /assets/sprites/units/princeps-cell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/princeps-cell.png -------------------------------------------------------------------------------- /assets/sprites/units/princeps-full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/princeps-full.png -------------------------------------------------------------------------------- /assets/sprites/units/princeps-leg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/princeps-leg.png -------------------------------------------------------------------------------- /assets/sprites/units/princeps-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/princeps-outline.png -------------------------------------------------------------------------------- /assets/sprites/units/princeps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/princeps.png -------------------------------------------------------------------------------- /assets/sprites/units/procurator-base.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/procurator-base.png -------------------------------------------------------------------------------- /assets/sprites/units/procurator-cell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/procurator-cell.png -------------------------------------------------------------------------------- /assets/sprites/units/procurator-full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/procurator-full.png -------------------------------------------------------------------------------- /assets/sprites/units/procurator-leg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/procurator-leg.png -------------------------------------------------------------------------------- /assets/sprites/units/procurator-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/procurator-outline.png -------------------------------------------------------------------------------- /assets/sprites/units/procurator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/procurator.png -------------------------------------------------------------------------------- /assets/sprites/units/pugione-base.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/pugione-base.png -------------------------------------------------------------------------------- /assets/sprites/units/pugione-cell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/pugione-cell.png -------------------------------------------------------------------------------- /assets/sprites/units/pugione-full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/pugione-full.png -------------------------------------------------------------------------------- /assets/sprites/units/pugione-leg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/pugione-leg.png -------------------------------------------------------------------------------- /assets/sprites/units/pugione-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/pugione-outline.png -------------------------------------------------------------------------------- /assets/sprites/units/pugione.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/pugione.png -------------------------------------------------------------------------------- /assets/sprites/units/spiculum-cell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/spiculum-cell.png -------------------------------------------------------------------------------- /assets/sprites/units/spiculum-full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/spiculum-full.png -------------------------------------------------------------------------------- /assets/sprites/units/spiculum-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/spiculum-outline.png -------------------------------------------------------------------------------- /assets/sprites/units/spiculum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/spiculum.png -------------------------------------------------------------------------------- /assets/sprites/units/tragula-base.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/tragula-base.png -------------------------------------------------------------------------------- /assets/sprites/units/tragula-cell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/tragula-cell.png -------------------------------------------------------------------------------- /assets/sprites/units/tragula-full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/tragula-full.png -------------------------------------------------------------------------------- /assets/sprites/units/tragula-leg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/tragula-leg.png -------------------------------------------------------------------------------- /assets/sprites/units/tragula-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/tragula-outline.png -------------------------------------------------------------------------------- /assets/sprites/units/tragula.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/tragula.png -------------------------------------------------------------------------------- /assets/sprites/units/traho-cell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/traho-cell.png -------------------------------------------------------------------------------- /assets/sprites/units/traho-full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/traho-full.png -------------------------------------------------------------------------------- /assets/sprites/units/traho-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/traho-outline.png -------------------------------------------------------------------------------- /assets/sprites/units/traho.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/units/traho.png -------------------------------------------------------------------------------- /assets/sprites/weapons/eteriusArtillery-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/weapons/eteriusArtillery-outline.png -------------------------------------------------------------------------------- /assets/sprites/weapons/eteriusArtillery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/weapons/eteriusArtillery.png -------------------------------------------------------------------------------- /assets/sprites/weapons/eteriusLaser-heat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/weapons/eteriusLaser-heat.png -------------------------------------------------------------------------------- /assets/sprites/weapons/eteriusLaser-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/weapons/eteriusLaser-outline.png -------------------------------------------------------------------------------- /assets/sprites/weapons/eteriusLaser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/weapons/eteriusLaser.png -------------------------------------------------------------------------------- /assets/sprites/weapons/inductorArtillery-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/weapons/inductorArtillery-outline.png -------------------------------------------------------------------------------- /assets/sprites/weapons/inductorArtillery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/weapons/inductorArtillery.png -------------------------------------------------------------------------------- /assets/sprites/weapons/inductorShotgun-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/weapons/inductorShotgun-outline.png -------------------------------------------------------------------------------- /assets/sprites/weapons/inductorShotgun.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/weapons/inductorShotgun.png -------------------------------------------------------------------------------- /assets/sprites/weapons/interitusArtillery-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/weapons/interitusArtillery-outline.png -------------------------------------------------------------------------------- /assets/sprites/weapons/interitusArtillery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/weapons/interitusArtillery.png -------------------------------------------------------------------------------- /assets/sprites/weapons/luciusWeapon-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/weapons/luciusWeapon-outline.png -------------------------------------------------------------------------------- /assets/sprites/weapons/luciusWeapon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/weapons/luciusWeapon.png -------------------------------------------------------------------------------- /assets/sprites/weapons/machaeraWeapon-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/weapons/machaeraWeapon-outline.png -------------------------------------------------------------------------------- /assets/sprites/weapons/machaeraWeapon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/weapons/machaeraWeapon.png -------------------------------------------------------------------------------- /assets/sprites/weapons/mucroWeapon-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/weapons/mucroWeapon-outline.png -------------------------------------------------------------------------------- /assets/sprites/weapons/mucroWeapon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/weapons/mucroWeapon.png -------------------------------------------------------------------------------- /assets/sprites/weapons/princepsWeapon-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/weapons/princepsWeapon-outline.png -------------------------------------------------------------------------------- /assets/sprites/weapons/princepsWeapon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/weapons/princepsWeapon.png -------------------------------------------------------------------------------- /assets/sprites/weapons/procuratorWeapon-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/weapons/procuratorWeapon-outline.png -------------------------------------------------------------------------------- /assets/sprites/weapons/procuratorWeapon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/weapons/procuratorWeapon.png -------------------------------------------------------------------------------- /assets/sprites/weapons/pugioneWeapon-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/weapons/pugioneWeapon-outline.png -------------------------------------------------------------------------------- /assets/sprites/weapons/pugioneWeapon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/weapons/pugioneWeapon.png -------------------------------------------------------------------------------- /assets/sprites/weapons/tragulaWeapon-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/weapons/tragulaWeapon-outline.png -------------------------------------------------------------------------------- /assets/sprites/weapons/tragulaWeapon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/weapons/tragulaWeapon.png -------------------------------------------------------------------------------- /assets/sprites/weapons/trahoWeapon-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/weapons/trahoWeapon-outline.png -------------------------------------------------------------------------------- /assets/sprites/weapons/trahoWeapon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/assets/sprites/weapons/trahoWeapon.png -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: "java" 2 | 3 | version '1.0' 4 | 5 | sourceSets.main.java.srcDirs = ["src"] 6 | 7 | repositories{ 8 | mavenCentral() 9 | maven{ url "https://raw.githubusercontent.com/Zelaux/MindustryRepo/master/repository" } 10 | maven{ url 'https://www.jitpack.io' } 11 | } 12 | 13 | java{ 14 | targetCompatibility = 8 15 | sourceCompatibility = JavaVersion.VERSION_17 16 | } 17 | 18 | ext{ 19 | //the build number that this mod is made for 20 | mindustryVersion = 'v146' 21 | jabelVersion = "93fde537c7" 22 | sdkRoot = System.getenv("ANDROID_HOME") ?: System.getenv("ANDROID_SDK_ROOT") 23 | } 24 | 25 | //java 8 backwards compatibility flag 26 | allprojects{ 27 | tasks.withType(JavaCompile){ 28 | options.compilerArgs.addAll(['--release', '8']) 29 | } 30 | } 31 | 32 | dependencies{ 33 | compileOnly "com.github.Anuken.Arc:arc-core:$mindustryVersion" 34 | compileOnly "com.github.Anuken.Mindustry:core:$mindustryVersion" 35 | 36 | annotationProcessor "com.github.Anuken:jabel:$jabelVersion" 37 | } 38 | 39 | //force arc version 40 | configurations.all{ 41 | resolutionStrategy.eachDependency { details -> 42 | if(details.requested.group == 'com.github.Anuken.Arc'){ 43 | details.useVersion "$mindustryVersion" 44 | } 45 | } 46 | } 47 | 48 | task jarAndroid{ 49 | dependsOn "jar" 50 | 51 | doLast{ 52 | if(!sdkRoot || !new File(sdkRoot).exists()) throw new GradleException("No valid Android SDK found. Ensure that ANDROID_HOME is set to your Android SDK directory."); 53 | 54 | def platformRoot = new File("$sdkRoot/platforms/").listFiles().sort().reverse().find{ f -> new File(f, "android.jar").exists()} 55 | 56 | if(!platformRoot) throw new GradleException("No android.jar found. Ensure that you have an Android platform installed.") 57 | 58 | //collect dependencies needed for desugaring 59 | def dependencies = (configurations.compileClasspath.asList() + configurations.runtimeClasspath.asList() + [new File(platformRoot, "android.jar")]).collect{ "--classpath $it.path" }.join(" ") 60 | 61 | //dex and desugar files - this requires d8 in your PATH 62 | "d8 $dependencies --min-api 14 --output ${project.archivesBaseName}Android.jar ${project.archivesBaseName}Desktop.jar" 63 | .execute(null, new File("$buildDir/libs")).waitForProcessOutput(System.out, System.err) 64 | } 65 | } 66 | 67 | jar{ 68 | archiveFileName = "${base.archivesBaseName}Desktop.jar" 69 | 70 | from{ 71 | configurations.runtimeClasspath.collect{ it.isDirectory() ? it : zipTree(it) } 72 | } 73 | 74 | from(rootDir){ 75 | include "mod.hjson" 76 | } 77 | 78 | from("assets/"){ 79 | include "**" 80 | } 81 | } 82 | 83 | task deploy(type: Jar){ 84 | dependsOn jarAndroid 85 | dependsOn jar 86 | archiveFileName = "${base.archivesBaseName}.jar" 87 | 88 | from{ [zipTree("$buildDir/libs/${project.archivesBaseName}Desktop.jar"), zipTree("$buildDir/libs/${project.archivesBaseName}Android.jar")] } 89 | 90 | doLast{ 91 | delete{ 92 | delete "$buildDir/libs/${project.archivesBaseName}Desktop.jar" 93 | delete "$buildDir/libs/${project.archivesBaseName}Android.jar" 94 | } 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zeniku/HeavyMachineryJava/d1d8300669c3322b9968799625cd0d0545d1b3e6/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.2.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Attempt to set APP_HOME 10 | # Resolve links: $0 may be a link 11 | PRG="$0" 12 | # Need this for relative symlinks. 13 | while [ -h "$PRG" ] ; do 14 | ls=`ls -ld "$PRG"` 15 | link=`expr "$ls" : '.*-> \(.*\)$'` 16 | if expr "$link" : '/.*' > /dev/null; then 17 | PRG="$link" 18 | else 19 | PRG=`dirname "$PRG"`"/$link" 20 | fi 21 | done 22 | SAVED="`pwd`" 23 | cd "`dirname \"$PRG\"`/" >/dev/null 24 | APP_HOME="`pwd -P`" 25 | cd "$SAVED" >/dev/null 26 | 27 | APP_NAME="Gradle" 28 | APP_BASE_NAME=`basename "$0"` 29 | 30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 31 | DEFAULT_JVM_OPTS="" 32 | 33 | # Use the maximum available, or set MAX_FD != -1 to use that value. 34 | MAX_FD="maximum" 35 | 36 | warn () { 37 | echo "$*" 38 | } 39 | 40 | die () { 41 | echo 42 | echo "$*" 43 | echo 44 | exit 1 45 | } 46 | 47 | # OS specific support (must be 'true' or 'false'). 48 | cygwin=false 49 | msys=false 50 | darwin=false 51 | nonstop=false 52 | case "`uname`" in 53 | CYGWIN* ) 54 | cygwin=true 55 | ;; 56 | Darwin* ) 57 | darwin=true 58 | ;; 59 | MINGW* ) 60 | msys=true 61 | ;; 62 | NONSTOP* ) 63 | nonstop=true 64 | ;; 65 | esac 66 | 67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 68 | 69 | # Determine the Java command to use to start the JVM. 70 | if [ -n "$JAVA_HOME" ] ; then 71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 72 | # IBM's JDK on AIX uses strange locations for the executables 73 | JAVACMD="$JAVA_HOME/jre/sh/java" 74 | else 75 | JAVACMD="$JAVA_HOME/bin/java" 76 | fi 77 | if [ ! -x "$JAVACMD" ] ; then 78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 79 | 80 | Please set the JAVA_HOME variable in your environment to match the 81 | location of your Java installation." 82 | fi 83 | else 84 | JAVACMD="java" 85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 86 | 87 | Please set the JAVA_HOME variable in your environment to match the 88 | location of your Java installation." 89 | fi 90 | 91 | # Increase the maximum file descriptors if we can. 92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 93 | MAX_FD_LIMIT=`ulimit -H -n` 94 | if [ $? -eq 0 ] ; then 95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 96 | MAX_FD="$MAX_FD_LIMIT" 97 | fi 98 | ulimit -n $MAX_FD 99 | if [ $? -ne 0 ] ; then 100 | warn "Could not set maximum file descriptor limit: $MAX_FD" 101 | fi 102 | else 103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 104 | fi 105 | fi 106 | 107 | # For Darwin, add options to specify how the application appears in the dock 108 | if $darwin; then 109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 110 | fi 111 | 112 | # For Cygwin, switch paths to Windows format before running java 113 | if $cygwin ; then 114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 116 | JAVACMD=`cygpath --unix "$JAVACMD"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Escape application args 158 | save () { 159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 160 | echo " " 161 | } 162 | APP_ARGS=$(save "$@") 163 | 164 | # Collect all arguments for the java command, following the shell quoting and substitution rules 165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 166 | 167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong 168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then 169 | cd "$(dirname "$0")" 170 | fi 171 | 172 | exec "$JAVACMD" "$@" 173 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS= 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /mod.hjson: -------------------------------------------------------------------------------- 1 | #the mod name as displayed in-game 2 | displayName: "HeavyMachineryJava" 3 | 4 | #the internal name of your mod 5 | name: "heavymachineryjava" 6 | 7 | #your name 8 | author: "Zeniku" 9 | 10 | #the fully qualified main class of the mod 11 | main: "heav.HeavyMachineryJava" 12 | 13 | #the mod description as seen in the mod dialog 14 | description: "A Mindustry Java mod." 15 | 16 | #the mod version 17 | version: 1.0 18 | 19 | #the minimum game build required to run this mod 20 | minGameVersion: 137 21 | 22 | java: true 23 | -------------------------------------------------------------------------------- /src/heav/HeavyMachineryJava.java: -------------------------------------------------------------------------------- 1 | package heav; 2 | 3 | import mindustry.mod.*; 4 | import heav.content.*; 5 | 6 | public class HeavyMachineryJava extends Mod{ 7 | 8 | public HeavyMachineryJava(){ 9 | 10 | } 11 | 12 | @Override 13 | public void loadContent(){ 14 | HMItems.load(); 15 | HMStatusEffects.load(); 16 | HMBullets.load(); 17 | HMUnits.load(); 18 | HMBlocks.load(); 19 | HMPlanets.load(); 20 | HMSectorPresents.load(); 21 | HMTechTree.load(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/heav/ai/types/DisabledPredictAi.java: -------------------------------------------------------------------------------- 1 | package heav.ai.types; 2 | 3 | import mindustry.ai.types.*; 4 | 5 | public class DisabledPredictAi extends GroundAI { 6 | @Override 7 | public void updateMovement(){ 8 | super.updateMovement(); 9 | boolean shoot = false; 10 | if(target != null && unit.inRange(target)){ 11 | unit.aimLook(target); 12 | shoot = true; 13 | } 14 | unit.controlWeapons(shoot); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/heav/content/HMBlocks.java: -------------------------------------------------------------------------------- 1 | package heav.content; 2 | 3 | import mindustry.content.*; 4 | import mindustry.entities.pattern.ShootAlternate; 5 | import mindustry.entities.pattern.ShootPattern; 6 | import mindustry.game.*; 7 | import mindustry.type.*; 8 | import mindustry.world.*; 9 | import mindustry.world.blocks.production.GenericCrafter; 10 | import mindustry.world.blocks.storage.*; 11 | import mindustry.world.draw.DrawFrames; 12 | import heav.world.blocks.defense.*; 13 | import heav.world.blocks.defense.turrets.*; 14 | 15 | import static mindustry.type.ItemStack.*; 16 | 17 | public class HMBlocks { 18 | public static Block 19 | //storage 20 | miniCore, 21 | //walls 22 | lonsdaleiteWall, lonsdaleiteWallLarge, 23 | //turrets 24 | heavenlyStrike, praefector, 25 | //defense 26 | statusEffectProjector, tesla, 27 | //Production 28 | lonsdaleiteCompressor; 29 | 30 | public static void load(){ 31 | statusEffectProjector = new StatusEffectProjector("statusEffectProjector"){{ 32 | statusFxEnemies = HMFx.flameBurst; 33 | healEffect = HMFx.healWave; 34 | size = 3; 35 | health = 900; 36 | requirements(Category.effect, with(Items.titanium, 200, Items.plastanium, 100, Items.silicon, 200, Items.graphite, 300)); 37 | consumePower(300f/60f); 38 | }}; 39 | 40 | tesla = new Tesla("tesla"){{ 41 | hitEffect = HMFx.spark; 42 | size = 3; 43 | health = 1500; 44 | requirements(Category.effect, with(Items.titanium, 150, Items.plastanium, 150, HMItems.lonsdaleite, 100, Items.silicon, 200, Items.graphite, 300)); 45 | consumePower(300f/60f); 46 | }}; 47 | 48 | lonsdaleiteCompressor = new GenericCrafter("lonsdaleite-compressor"){{ 49 | size = 3; 50 | hasPower = true; 51 | hasItems = true; 52 | hasLiquids = false; 53 | craftTime = 45; 54 | craftEffect = Fx.producesmoke; 55 | update = true; 56 | itemCapacity = 30; 57 | consumePower(0.7f); 58 | consumeItem(Items.graphite, 20); 59 | 60 | drawer = new DrawFrames(){{ 61 | frames = 4; 62 | }}; 63 | 64 | outputItem = new ItemStack(HMItems.lonsdaleite, 1); 65 | requirements(Category.crafting, with(Items.copper, 100, Items.lead, 150, Items.silicon, 250, Items.titanium, 120, Items.graphite, 80)); 66 | }}; 67 | 68 | heavenlyStrike = new FractalTurret("heavenlyStrike"){{ 69 | health = 1540; 70 | recoil = 0; 71 | shoot = new ShootPattern(){{ 72 | shots = 3; 73 | }}; 74 | size = 4; 75 | reload = 20f; 76 | shootType = HMBullets.mediumSword; 77 | range = (shootType.lifetime * shootType.speed) / 2f; 78 | requirements(Category.turret, with(HMItems.lonsdaleite, 150, Items.titanium, 200, Items.lead, 280)); 79 | }}; 80 | 81 | praefector = new DisabledPredictTurret("praefector"){{ 82 | health = 1280; 83 | recoil = 2; 84 | shoot = new ShootAlternate(){{ 85 | shots = 2; 86 | }}; 87 | size = 4; 88 | reload = 15f; 89 | shootType = HMBullets.mediumOverseer; 90 | range = (shootType.lifetime * shootType.speed) / 1.5f; 91 | requirements(Category.turret, with(HMItems.lonsdaleite, 100, Items.titanium, 150, Items.lead, 180)); 92 | }}; 93 | 94 | lonsdaleiteWall = new DRWall("lonsdaleiteWall"){{ 95 | dRChance = 15f; 96 | dRPercentage = 20f; 97 | health = 520; 98 | insulated = true; 99 | requirements(Category.defense, with(HMItems.lonsdaleite, 6, Items.phaseFabric, 6)); 100 | }}; 101 | 102 | lonsdaleiteWallLarge = new DRWall("lonsdaleiteWallLarge"){{ 103 | size = 2; 104 | dRChance = 15f; 105 | dRPercentage = 45f; 106 | health = 2800; 107 | insulated = true; 108 | requirements(Category.defense, with(HMItems.lonsdaleite, 24, Items.phaseFabric, 24)); 109 | }}; 110 | 111 | miniCore = new CoreBlock("miniCore"){ 112 | { 113 | alwaysUnlocked = false; 114 | unitType = UnitTypes.alpha; 115 | health = 1200; 116 | itemCapacity = 1500; 117 | size = 2; 118 | unitCapModifier = 0; 119 | requirements(Category.effect, with(Items.lead, 1500, Items.silicon, 2000, Items.copper, 1500, Items.titanium, 1500)); 120 | }; 121 | 122 | @Override 123 | public boolean canPlaceOn(Tile tile, Team team, int rotation){ 124 | return true; 125 | } 126 | }; 127 | } 128 | } 129 | -------------------------------------------------------------------------------- /src/heav/content/HMBullets.java: -------------------------------------------------------------------------------- 1 | package heav.content; 2 | 3 | import arc.graphics.*; 4 | import mindustry.graphics.*; 5 | import mindustry.entities.bullet.*; 6 | import mindustry.gen.*; 7 | import mindustry.content.*; 8 | import heav.entities.bullet.*; 9 | 10 | public class HMBullets { 11 | public static BulletType 12 | //Overseer 13 | standardOverseer, mediumOverseer, highOverseer, 14 | //Ground Spike 15 | standardSpike, mediumSpike, highSpike, 16 | //Orbiter 17 | standardOrbiter, mediumOrbiter, highOrbiter, 18 | //Swords 19 | standardSword, mediumSword, highSword, 20 | //Portal 21 | standardPortal, mediumPortal, highPortal, 22 | 23 | //UnitSpecific 24 | luciusBullet, machaeraBullet; 25 | 26 | public static void load(){ 27 | standardOverseer = new OverseerBulletType(2.5f, 18){{ 28 | width = 7f; 29 | height = 9f; 30 | reloadMultiplier = 1.5f; 31 | ammoMultiplier = 5; 32 | lifetime = 60f * 2f; 33 | trailWidth = 2f; 34 | trailLength = 10; 35 | trailColor = Pal.lancerLaser; 36 | }}; 37 | 38 | mediumOverseer = new OverseerBulletType(3f, 28){{ 39 | width = 9f; 40 | height = 11f; 41 | reloadMultiplier = 2f; 42 | ammoMultiplier = 5; 43 | lifetime = 60f * 2f; 44 | trailWidth = 3f; 45 | trailLength = 10; 46 | trailColor = Pal.lancerLaser; 47 | }}; 48 | 49 | highOverseer = new OverseerBulletType(4f, 49){{ 50 | width = 11f; 51 | height = 13f; 52 | reloadMultiplier = 4f; 53 | ammoMultiplier = 7; 54 | lifetime = 60f * 4f; 55 | trailWidth = 2f; 56 | trailLength = 15; 57 | trailColor = Pal.lancerLaser; 58 | }}; 59 | 60 | standardOrbiter = new OrbiterBulletType(2f, 30){{ 61 | width = 7f; 62 | height = 9f; 63 | lifetime = 60f * 2f; 64 | hitSound = Sounds.plasmaboom; 65 | hitEffect = HMFx.orbExplode; 66 | orbiter = standardOverseer; 67 | trailColor = Pal.lancerLaser; 68 | }}; 69 | 70 | mediumOrbiter = new OrbiterBulletType(2f, 40){{ 71 | width = 9f; 72 | height = 11f; 73 | lifetime = 60f * 3f; 74 | hitSound = Sounds.plasmaboom; 75 | hitEffect = HMFx.orbExplode; 76 | orbiter = standardOverseer; 77 | trailColor = Pal.lancerLaser; 78 | }}; 79 | 80 | highOrbiter = new OrbiterBulletType(3f, 50){{ 81 | width = 11f; 82 | height = 13f; 83 | lifetime = 60f * 4f; 84 | hitSound = Sounds.plasmaboom; 85 | hitEffect = HMFx.orbExplode; 86 | orbiter = standardOverseer; 87 | trailColor = Pal.lancerLaser; 88 | }}; 89 | 90 | standardSword = new RandSpriteBulletType(3f, 18, "heavymachineryjava-swordBullet"){{ 91 | lifetime = 60f; 92 | pierceCap = 10; 93 | trailWidth = 4.5f; 94 | critTrail = HMFx.critTrail; 95 | spawnFx = HMFx.swordSpawnFx; 96 | trailColor = Pal.heal; 97 | }}; 98 | 99 | mediumSword = new RandSpriteBulletType(3f, 29, "heavymachineryjava-swordBullet"){{ 100 | lifetime = 60f * 1.5f; 101 | pierceCap = 10; 102 | trailWidth = 4.5f; 103 | critTrail = HMFx.critTrail; 104 | spawnFx = HMFx.swordSpawnFx; 105 | trailColor = Pal.heal; 106 | }}; 107 | 108 | highSword = new RandSpriteBulletType(3f, 40, "heavymachineryjava-swordBullet"){{ 109 | lifetime = 60f * 2.5f; 110 | pierceCap = 10; 111 | trailWidth = 4.5f; 112 | critTrail = HMFx.critTrail; 113 | spawnFx = HMFx.swordSpawnFx; 114 | trailColor = Pal.heal; 115 | }}; 116 | 117 | standardSpike = new ShrapnelBulletType(){{ 118 | fromColor = Color.valueOf("404040FF"); 119 | toColor = Color.valueOf("2a2a2aFF"); 120 | hitColor = Color.valueOf("2a2a2aFF"); 121 | shootEffect = Fx.none; 122 | smokeEffect = Fx.none; 123 | serrations = 3; 124 | hitEffect = Fx.mine; 125 | knockback = 0; 126 | reflectable = false; 127 | width = 0; 128 | length = 16; 129 | lifetime = 12; 130 | serrations = 3; 131 | serrationWidth = 11; 132 | serrationSpacing = 4; 133 | serrationSpaceOffset = 9; 134 | serrationLenScl = 6; 135 | serrationFadeOffset = 0; 136 | damage = 20; 137 | recoil = -3; //dash 138 | }}; 139 | 140 | mediumSpike = new ShrapnelBulletType(){{ 141 | fromColor = Color.valueOf("404040FF"); 142 | toColor = Color.valueOf("2a2a2aFF"); 143 | hitColor = Color.valueOf("2a2a2aFF"); 144 | shootEffect = Fx.none; 145 | smokeEffect = Fx.none; 146 | serrations = 3; 147 | hitEffect = Fx.mine; 148 | knockback = 0; 149 | reflectable = false; 150 | lifetime = 20; 151 | width = 0; 152 | length = 24; 153 | serrations = 3; 154 | serrationWidth = 11; 155 | serrationSpacing = 4; 156 | serrationSpaceOffset = 9; 157 | serrationLenScl = 6; 158 | serrationFadeOffset = 0; 159 | damage = 30; 160 | recoil = -2; //dass 161 | }}; 162 | 163 | highSpike = new ShrapnelBulletType(){{ 164 | fromColor = Color.valueOf("404040FF"); 165 | toColor = Color.valueOf("2a2a2aFF"); 166 | hitColor = Color.valueOf("2a2a2aFF"); 167 | shootEffect = Fx.none; 168 | smokeEffect = Fx.none; 169 | serrations = 3; 170 | hitEffect = Fx.mine; 171 | knockback = 0; 172 | reflectable = false; 173 | lifetime = 30; 174 | width = 8; 175 | length = 32; 176 | serrations = 3; 177 | damage = 40; 178 | recoil = -2; //dash 179 | knockback = 0; 180 | fragBullet = standardSpike; 181 | fragBullets = 3; 182 | }}; 183 | 184 | //Portal 185 | standardPortal = new PortalBulletType(){{}}; 186 | 187 | //UnitSpecific 188 | luciusBullet = new ShrapnelBulletType(){{ 189 | fromColor = Color.valueOf("404040"); 190 | toColor = Color.valueOf("2a2a2a"); 191 | hitColor = Color.valueOf("2a2a2a"); 192 | shootEffect = Fx.none; 193 | smokeEffect = Fx.none; 194 | serrations = 3; 195 | hitEffect = Fx.mine; 196 | knockback = 0; 197 | reflectable = false; 198 | lifetime = 40; 199 | width = 10; 200 | length = 40; 201 | serrations = 3; 202 | damage = 65; 203 | recoil = -2; //dash 204 | knockback = -1; 205 | fragBullet = mediumSpike; 206 | fragBullets = 4; 207 | }}; 208 | 209 | machaeraBullet = new ShrapnelBulletType(){{ 210 | fromColor = Color.valueOf("404040FF"); 211 | toColor = Color.valueOf("2a2a2aFF"); 212 | hitColor = Color.valueOf("2a2a2aFF"); 213 | shootEffect = Fx.none; 214 | smokeEffect = Fx.none; 215 | serrations = 3; 216 | hitEffect = Fx.mine; 217 | knockback = 0; 218 | reflectable = false; 219 | lifetime = 40; 220 | width = 15; 221 | length = 50; 222 | serrations = 5; 223 | damage = 75; 224 | recoil = -2; //dash 225 | knockback = -1; 226 | fragBullet = mediumSpike; 227 | fragBullets = 5; 228 | }}; 229 | } 230 | } 231 | -------------------------------------------------------------------------------- /src/heav/content/HMFx.java: -------------------------------------------------------------------------------- 1 | package heav.content; 2 | 3 | import arc.graphics.*; 4 | import arc.graphics.g2d.*; 5 | import arc.math.*; 6 | import arc.math.geom.*; 7 | import mindustry.entities.*; 8 | import mindustry.graphics.*; 9 | import heav.util.*; 10 | 11 | import static arc.graphics.g2d.Draw.*; 12 | import static arc.graphics.g2d.Lines.*; 13 | import static arc.math.Angles.*; 14 | import static mindustry.Vars.*; 15 | 16 | public class HMFx { 17 | private static final Rand rand = new Rand(); 18 | private static final Vec2 v1 = new Vec2(), v2 = new Vec2(); 19 | 20 | public static final Effect 21 | 22 | fakeLightning = new Effect(10f, 500f, e -> { 23 | if(!(e.data instanceof LightningData d)) return; 24 | float tx = d.pos.getX(), ty = d.pos.getY(), dst = Mathf.dst(e.x, e.y, tx, ty); 25 | v1.set(d.pos).sub(e.x, e.y).nor(); 26 | 27 | float normx = v1.x, normy = v1.y; 28 | float range = 6f; 29 | int links = Mathf.ceil(dst / range); 30 | float spacing = dst / links; 31 | 32 | stroke(d.stroke * e.fout()); 33 | color(Color.white, e.color, e.fin()); 34 | 35 | beginLine(); 36 | 37 | linePoint(e.x, e.y); 38 | 39 | rand.setSeed(e.id); 40 | 41 | for(int i = 0; i < links; i++){ 42 | float nx, ny; 43 | if(i == links - 1){ 44 | nx = tx; 45 | ny = ty; 46 | }else{ 47 | float len = (i + 1) * spacing; 48 | v1.setToRandomDirection(rand).scl(range/2f); 49 | nx = e.x + normx * len + v1.x; 50 | ny = e.y + normy * len + v1.y; 51 | } 52 | 53 | linePoint(nx, ny); 54 | } 55 | 56 | endLine(); 57 | }).followParent(false).layer(Layer.bullet + 0.01f), 58 | 59 | //[length, width, team] 60 | fakeLightningFast = new Effect(5f, 500f, e -> { 61 | Object[] data = (Object[])e.data; 62 | 63 | float length = (float)data[0]; 64 | int tileLength = Mathf.round(length / tilesize); 65 | 66 | stroke((float)data[1] * e.fout()); 67 | color(e.color, Color.white, e.fin()); 68 | 69 | for(int i = 0; i < tileLength; i++){ 70 | float offsetXA = i == 0 ? 0f : Mathf.randomSeed(e.id + (i * 6413), -4.5f, 4.5f); 71 | float offsetYA = (length / tileLength) * i; 72 | 73 | int f = i + 1; 74 | 75 | float offsetXB = f == tileLength ? 0f : Mathf.randomSeed(e.id + (f * 6413), -4.5f, 4.5f); 76 | float offsetYB = (length / tileLength) * f; 77 | 78 | v1.trns(e.rotation, offsetYA, offsetXA); 79 | v1.add(e.x, e.y); 80 | 81 | v2.trns(e.rotation, offsetYB, offsetXB); 82 | v2.add(e.x, e.y); 83 | 84 | line(v1.x, v1.y, v2.x, v2.y, false); 85 | Fill.circle(v1.x, v1.y, getStroke() / 2f); 86 | Drawf.light(v1.x, v1.y, v2.x, v2.y, (float)data[1] * 3f, e.color, 0.4f); 87 | } 88 | Fill.circle(v2.x, v2.y, getStroke() / 2); 89 | }).layer(Layer.bullet + 0.01f), 90 | 91 | flameBurst = new Effect(40, e -> { 92 | HMDraw.splashCircle(e.x, e.y, e.fout() * 2.5f, Pal.lightPyraFlame, Pal.darkFlame, e.fin(), e.id, 3, 2f + e.fin() * 9f, e.rotation, 360f); 93 | }), 94 | 95 | blockSplash = new Effect(40, e -> { 96 | //e.rotation = block size soo h; 97 | stroke((2 + e.rotation) * e.fout(), e.color); 98 | square(e.x, e.y, ((tilesize * e.rotation) / 2) * e.fin()); 99 | }), 100 | 101 | spark = new Effect(40, e -> { 102 | color(Pal.lancerLaser); 103 | HMDraw.splashLine(e.x, e.y, 4 * e.fout(), 3 * e.fin(), e.id, 4, e.finpow() * 16, e.rotation, 45); 104 | }), 105 | 106 | healWave = new Effect(22, e -> { 107 | //e.rotation is size 108 | HMDraw.lineCircle(e.x, e.y, e.color, e.fout() * 3, 4 + e.finpow() * e.rotation); 109 | }), 110 | 111 | critTrail = new Effect(20, e -> { 112 | color(Pal.heal); 113 | randLenVectors(e.id, 3, 1 + e.fin() * 3, (x, y) -> { 114 | Fill.square(e.x + x, e.y + y, e.fout() * 3.3f + 0.5f); 115 | }); 116 | }), 117 | 118 | swordSpawnFx = new Effect(20, e -> { 119 | color(Pal.heal); 120 | stroke(4 * (1 - e.finpow())); 121 | circle(e.x, e.y, 8 * e.finpow()); 122 | }), 123 | 124 | orbExplode = new Effect(45, e -> { 125 | color(Pal.lancerLaser); 126 | HMDraw.splashLine(e.x, e.y, 10f * e.fout(), 6f * e.fout(), e.id, 20, e.finpow() * (tilesize * 4f), e.rotation, 360f); 127 | HMDraw.lineCircle(e.x, e.y, 4f * e.finpow(), (tilesize * 3f) * e.finpow()); 128 | }), 129 | 130 | boom = new Effect(30, e -> { 131 | color(Pal.sapBullet, Pal.sapBulletBack, e.fin()); 132 | HMDraw.splashCircle(e.x, e.y, 5 * e.fslope(), e.id, 15, e.finpow() * (8 * 5), e.rotation, 360); 133 | HMDraw.lineCircle(e.x, e.y, Pal.sapBullet, 4 * e.fout(), (4 * 8) * e.fin()); 134 | HMDraw.splashLine(e.x, e.y, Pal.sapBullet, Color.valueOf("b28768ff"), e.fin(), 4 * e.fout(), 6 * e.fout(), e.id, 15, e.finpow() * (8 * 5), e.rotation, 360); 135 | }), 136 | 137 | bigBoom = new Effect(30, e -> { 138 | color(Pal.sapBullet, Pal.sapBulletBack, e.fin()); 139 | HMDraw.splashCircle(e.x, e.y, 5 * e.fslope(), e.id, 20, e.finpow() * (8 * 10), e.rotation, 360); 140 | HMDraw.lineCircle(e.x, e.y, 4 * e.fout(), (6 * 7) * e.finpow()); 141 | HMDraw.lineCircle(e.x, e.y, 6 * e.fout(), (6 * 11) * e.finpow()); 142 | HMDraw.splashLine(e.x, e.y, Pal.sapBullet, Color.valueOf("b28768ff"), e.fin(), 4 * e.fout(), 6 * e.fout(), e.id, 20, e.finpow() * (8 * 10), e.rotation, 360); 143 | }), 144 | 145 | laserCharge = new Effect(80, e -> { 146 | color(Pal.sapBullet, Pal.sapBulletBack, e.fin()); 147 | HMDraw.splashCircle(e.x, e.y, 5 * e.fslope(), e.id, 20, (1 - e.finpow()) * (8 * 6), e.rotation, 360); 148 | HMDraw.lineCircle(e.x, e.y, 4 * e.fin(), (6 * 7) * (1 - e.finpow())); 149 | HMDraw.lineCircle(e.x, e.y, 4 * e.fin(), (6 * 11) * (1 - e.finpow())); 150 | color(Pal.sapBullet); 151 | Fill.circle(e.x, e.y, 10 * e.fin()); 152 | color(Color.white); 153 | Fill.circle(e.x, e.y, 8 * e.fin()); 154 | }), 155 | 156 | earthDust = new Effect(20, e -> { 157 | color(e.color); 158 | HMDraw.splashCircle(e.x, e.y, 2.5f * e.fslope(), e.id, 10, e.finpow() * 10, e.rotation, 360); 159 | }).layer(Layer.debris), 160 | 161 | earthDustII = new Effect(30, e -> { 162 | color(e.color); 163 | HMDraw.splashCircle(e.x, e.y, 5 * e.fslope(), e.id, 20, e.finpow() * 20, e.rotation, 360); 164 | }).layer(Layer.debris); 165 | 166 | public static class LightningData{ 167 | Position pos; 168 | float stroke; 169 | 170 | public LightningData(Position pos, float stroke){ 171 | this.pos = pos; 172 | this.stroke = stroke; 173 | }; 174 | }; 175 | }; 176 | -------------------------------------------------------------------------------- /src/heav/content/HMItems.java: -------------------------------------------------------------------------------- 1 | package heav.content; 2 | 3 | import arc.graphics.*; 4 | import mindustry.type.*; 5 | 6 | public class HMItems { 7 | public static Item 8 | lonsdaleite; 9 | 10 | public static void load(){ 11 | lonsdaleite = new Item("lonsdaleite", Color.valueOf("8b95e0")){{ 12 | cost = 2.5f; 13 | }}; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/heav/content/HMPlanets.java: -------------------------------------------------------------------------------- 1 | package heav.content; 2 | 3 | import mindustry.type.Planet; 4 | import mindustry.content.Planets; 5 | import mindustry.graphics.g3d.*; 6 | import arc.graphics.Color; 7 | import heav.maps.*; 8 | 9 | public class HMPlanets { 10 | public static Planet caeruleum; 11 | 12 | public static void load() { 13 | caeruleum = new Planet("caeruleum", Planets.sun, 1f, 3){{ 14 | generator = new CaeruleumPlanetGenerator(); 15 | meshLoader = () -> new HexMesh(this, 6); 16 | cloudMeshLoader = () -> new MultiMesh( 17 | new HexSkyMesh(this, 11, 0.15f, 0.13f, 5, new Color().set(Color.valueOf("363f9a")).mul(0.9f).a(0.75f), 2, 0.45f, 0.9f, 0.38f), 18 | new HexSkyMesh(this, 1, 0.6f, 0.16f, 5, Color.white.cpy().lerp(Color.valueOf("363f9a"), 0.55f).a(0.75f), 2, 0.45f, 1f, 0.41f) 19 | ); 20 | atmosphereRadIn = 0.02f; 21 | atmosphereRadOut = 0.3f; 22 | atmosphereColor = Color.valueOf("363f9a"); 23 | landCloudColor = atmosphereColor.cpy().a(0.5f); 24 | startSector = 10; 25 | }}; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/heav/content/HMSectorPresents.java: -------------------------------------------------------------------------------- 1 | package heav.content; 2 | 3 | import mindustry.type.SectorPreset; 4 | 5 | public class HMSectorPresents { 6 | public static SectorPreset generated; 7 | public static void load() { 8 | generated = new SectorPreset("generated", HMPlanets.caeruleum, 10){{ 9 | alwaysUnlocked = true; 10 | difficulty = 2f; 11 | captureWave = 20; 12 | addStartingItems = true; 13 | }}; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/heav/content/HMStatusEffects.java: -------------------------------------------------------------------------------- 1 | package heav.content; 2 | 3 | import heav.type.ShieldStatusEffect; 4 | import mindustry.type.StatusEffect; 5 | 6 | public class HMStatusEffects { 7 | public static StatusEffect 8 | armored, shieldBreak; 9 | 10 | public static void load(){ 11 | armored = new ShieldStatusEffect("sheilded"){{ 12 | shieldAmount = 15f; 13 | maxShield = 240f; 14 | }}; 15 | 16 | shieldBreak = new ShieldStatusEffect("sheildBreak"){{ 17 | shieldAmount = 15f; 18 | maxShield = 240f; 19 | remove = true; 20 | }}; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/heav/content/HMTechTree.java: -------------------------------------------------------------------------------- 1 | package heav.content; 2 | 3 | import arc.util.Nullable; 4 | import arc.func.Boolf; 5 | import arc.struct.Seq; 6 | import mindustry.content.*; 7 | import mindustry.content.TechTree.TechNode; 8 | import mindustry.ctype.UnlockableContent; 9 | import mindustry.type.ItemStack; 10 | import mindustry.game.Objectives.*; 11 | 12 | public class HMTechTree { 13 | static TechTree.TechNode context = null; 14 | 15 | private static TechNode get(String tree, UnlockableContent parent){ 16 | return findNode(TechTree.roots.find(r -> r.name == tree), n -> n.content == parent); 17 | } 18 | 19 | private static TechNode get(UnlockableContent parent){ 20 | return get("serpulo", parent); 21 | } 22 | 23 | private static void vanillaNode(UnlockableContent parent, Runnable children){ 24 | vanillaNode("serpulo", parent, children); 25 | } 26 | 27 | private static void vanillaNode(String tree, UnlockableContent parent, Runnable children){ 28 | context = get(tree, parent); 29 | children.run(); 30 | } 31 | 32 | 33 | private static TechNode findNode(TechNode root, Boolf filter){ 34 | if(filter.get(root)) return root; 35 | for(TechNode node : root.children){ 36 | TechNode search = findNode(node, filter); 37 | if(search != null) return search; 38 | } 39 | return null; 40 | } 41 | 42 | private static void node(UnlockableContent parent, UnlockableContent child, @Nullable ItemStack[] requirements, Seq objectives) { 43 | ItemStack[] requirementsIn = (requirements != null)? requirements : child.researchRequirements(); 44 | TechNode newNode = new TechTree.TechNode(get(parent), child, requirementsIn); 45 | 46 | if (objectives != null) newNode.objectives.addAll(objectives); 47 | } 48 | 49 | private static void node(UnlockableContent parent, UnlockableContent child, @Nullable ItemStack[] requirements) { 50 | node(parent, child, requirements, null); 51 | } 52 | 53 | private static void node(UnlockableContent parent, UnlockableContent child) { 54 | node(parent, child, null); 55 | } 56 | 57 | public static void load(){ 58 | // Planets and SectorPresets 59 | node(SectorPresets.tarFields, HMPlanets.caeruleum, null, Seq.with(new SectorComplete(SectorPresets.tarFields))); 60 | node(HMPlanets.caeruleum, HMSectorPresents.generated); 61 | 62 | //Blocks 63 | node(Blocks.coreFoundation, HMBlocks.miniCore); 64 | node(Blocks.lancer, HMBlocks.praefector); 65 | node(HMBlocks.praefector, HMBlocks.heavenlyStrike); 66 | node(Blocks.plastaniumWallLarge, HMBlocks.lonsdaleiteWall); 67 | node(HMBlocks.lonsdaleiteWall, HMBlocks.lonsdaleiteWallLarge); 68 | node(Blocks.overdriveProjector, HMBlocks.statusEffectProjector); 69 | node(HMBlocks.statusEffectProjector, HMBlocks.tesla); 70 | node(Blocks.siliconCrucible, HMBlocks.lonsdaleiteCompressor); 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/heav/content/HMUnits.java: -------------------------------------------------------------------------------- 1 | package heav.content; 2 | 3 | import arc.graphics.*; 4 | import mindustry.content.*; 5 | import mindustry.entities.bullet.*; 6 | import mindustry.entities.pattern.ShootSpread; 7 | import mindustry.ai.types.*; 8 | import mindustry.gen.*; 9 | import mindustry.type.*; 10 | import mindustry.graphics.*; 11 | import heav.entities.bullet.*; 12 | import heav.entities.abilities.*; 13 | import heav.ai.types.*; 14 | 15 | public class HMUnits{ 16 | public static UnitType 17 | //Purple Air 18 | aranea, traho, spiculum, interitus, eterius, 19 | //OverSeer 20 | princeps, procurator, inductor, 21 | //Melee 22 | pugione, mucro, tragula, lucius, machaera; 23 | 24 | public static void load(){ 25 | aranea = new UnitType("aranea"){{ 26 | speed = 1.5f; 27 | hitSize = 8; 28 | health = 180f; 29 | range = 180f; 30 | maxRange = 180f; 31 | flying = true; 32 | circleTarget = true; 33 | aiController = FlyingAI::new; 34 | constructor = UnitEntity::create; 35 | weapons.add( 36 | new Weapon(){{ 37 | reload = 24; 38 | shootCone = 180; 39 | ejectEffect = Fx.none; 40 | shootSound = Sounds.explosion; 41 | bullet = new BombBulletType(0f, 0f, "clear"){{ 42 | hitEffect = Fx.pulverize; 43 | lifetime = 10f; 44 | splashDamageRadius = 70f; 45 | instantDisappear = true; 46 | splashDamage = 80f; 47 | killShooter = true; 48 | hittable = false; 49 | collidesAir = true; 50 | }}; 51 | }} 52 | ); 53 | }}; 54 | 55 | traho = new UnitType("traho"){{ 56 | speed = 1.5f; 57 | hitSize = 10.5f; 58 | health = 380; 59 | flying = true; 60 | circleTarget = false; 61 | lowAltitude = true; 62 | armor = 2; 63 | aiController = FlyingAI::new; 64 | constructor = UnitEntity::create; 65 | circleTarget = false; 66 | 67 | weapons.add( 68 | new Weapon("heavymachineryjava-trahoWeapon"){{ 69 | x = 0; 70 | y = -5 / 4; 71 | recoil = 0; 72 | reload = 30; 73 | rotate = true; 74 | continuous = true; 75 | shootSound = Sounds.tractorbeam; 76 | bullet = new RayBulletType(3f, 142f){{ 77 | width = 2f; 78 | maxRange = 142; 79 | lifetime = 120; 80 | force = 8f; 81 | scaledForce = 70f; 82 | }}; 83 | }}, 84 | new Weapon("heavymachineryjava-trahoWeaponII"){{ 85 | x = 3 / 4; 86 | y = 0; 87 | shootY = 25 / 4; 88 | reload = 30; 89 | rotate = false; 90 | bullet = new SapBulletType(){{ 91 | length = 8 * 10; 92 | damage = 20; 93 | shootEffect = Fx.shootSmall; 94 | hitColor = Pal.sapBullet; 95 | color = Pal.sapBullet; 96 | despawnEffect = Fx.none; 97 | width = 0.5f; 98 | knockback = 0; 99 | }}; 100 | }} 101 | ); 102 | }}; 103 | 104 | spiculum = new UnitType("spiculum"){{ 105 | speed = 3.5f; 106 | accel = 1.5f; 107 | hitSize = 22f; 108 | health = 780; 109 | flying = true; 110 | circleTarget = true; 111 | maxRange = 240; 112 | range = 240; 113 | lowAltitude = true; 114 | armor = 3; 115 | aiController = FlyingAI::new; 116 | constructor = UnitEntity::create; 117 | weapons.add( 118 | new Weapon("heavymachineryjava-spiculumWeapon"){{ 119 | x = 34 / 4; 120 | y = 0; 121 | reload = 15; 122 | rotate = false; 123 | bullet = new SapBulletType(){{ 124 | length = 8 * 10; 125 | damage = 37; 126 | shootEffect = Fx.shootSmall; 127 | hitColor = color = Pal.sapBullet; 128 | despawnEffect = Fx.none; 129 | width = 0.5f; 130 | knockback = 2.5f; 131 | }}; 132 | }} 133 | ); 134 | abilities.add( 135 | new LaserMoveAbility(new ContinuousLaserBulletType(20){{ 136 | length = 8f * 5f; 137 | damage = 23f; 138 | width = 3f; 139 | colors = new Color[]{Pal.sapBullet, Pal.sapBulletBack, Color.white}; 140 | }}, 27f / 4f, 27f / 4f, 2, 5)); 141 | }}; 142 | 143 | interitus = new UnitType("interitus"){{ 144 | speed = 1f; 145 | accel = 1f; 146 | hitSize = 47.75f; 147 | health = 6850; 148 | flying = true; 149 | lowAltitude = true; 150 | armor = 5; 151 | engineOffset = 24.25f; 152 | engineSize = 5; 153 | aiController = FlyingAI::new; 154 | constructor = UnitEntity::create; 155 | 156 | weapons.add( 157 | new Weapon("heavymachineryjava-interitusSpikeWeapon"){{ 158 | reload = 30; 159 | rotate = true; 160 | x = 49 / 4; 161 | y = 27 / 4; 162 | bullet = new ShrapnelBulletType(){{ 163 | fromColor = Pal.sapBullet; 164 | toColor = hitColor = Pal.sapBulletBack; 165 | length = 30 * 8; 166 | damage = 25; 167 | width = 16; 168 | status = StatusEffects.sapped; 169 | statusDuration = 60 * 7; 170 | serrations = 4; 171 | }}; 172 | shootSound = Sounds.shotgun; 173 | }}, 174 | 175 | new Weapon("heavymachineryjava-interitusSpikeWeapon"){{ 176 | reload = 20; 177 | rotate = true; 178 | x = 74 / 4; 179 | y = -9 / 4; 180 | bullet = new ShrapnelBulletType(){{ 181 | fromColor = Pal.sapBullet; 182 | toColor = hitColor = Pal.sapBulletBack; 183 | length = 25 * 8; 184 | damage = 25; 185 | width = 16; 186 | status = StatusEffects.sapped; 187 | statusDuration = 60 * 7; 188 | serrations = 4; 189 | }}; 190 | shootSound = Sounds.shotgun; 191 | }}, 192 | 193 | new Weapon("heavymachineryjava-interitusArtillery"){{ 194 | reload = 60 * 4; 195 | recoil = 4; 196 | bullet = new ArtilleryBulletType(){{ 197 | collidesAir = true; 198 | collides = true; 199 | collidesTiles = true; 200 | speed = 3.7f; 201 | lifetime = 55; 202 | hitEffect = despawnEffect = HMFx.bigBoom; 203 | height = 16; 204 | width = 16; 205 | damage = 230; 206 | splashDamage = 40; 207 | splashDamageRadius = 10 * 8; 208 | frontColor = Pal.sapBullet; 209 | backColor = Pal.sapBulletBack; 210 | fragBullets = 3; 211 | fragBullet = new ArtilleryBulletType(){{ 212 | collidesAir = true; 213 | collides = true; 214 | collidesTiles = true; 215 | despawnEffect = HMFx.boom; 216 | damage = 30; 217 | splashDamage = 15; 218 | splashDamageRadius = 3 * 8; 219 | hitColor = backColor = Pal.sapBulletBack; 220 | frontColor = Pal.sapBullet; 221 | status = StatusEffects.sapped; 222 | statusDuration = 60 * 7; 223 | height = 10; 224 | width = 10; 225 | }}; 226 | status = StatusEffects.sapped; 227 | statusDuration = 60 * 7; 228 | hitSound = Sounds.explosionbig; 229 | }}; 230 | y = -15 / 4; 231 | x = 0; 232 | shootY = 58/ 4; 233 | mirror = false; 234 | shake = 7; 235 | rotate = true; 236 | rotateSpeed = 1.5f; 237 | shootSound = Sounds.shootBig; 238 | }} 239 | ); 240 | }}; 241 | 242 | eterius = new UnitType("eterius"){{ 243 | speed = 1; 244 | accel = 1; 245 | hitSize = 73.25f; 246 | health = 21000; 247 | flying = true; 248 | lowAltitude = true; 249 | armor = 9; 250 | engineOffset = 24.25f; 251 | engineSize = 5; 252 | range = 280; 253 | maxRange = 280; 254 | aiController = FlyingAI::new; 255 | constructor = UnitEntity::create; 256 | 257 | weapons.add( 258 | new Weapon("heavymachineryjava-eteriusLaser"){{ 259 | x = 0; 260 | y = -5 / 4; 261 | mirror = false; 262 | rotate = true; 263 | rotateSpeed = 1.5f; 264 | shoot.firstShotDelay = HMFx.laserCharge.lifetime; 265 | recoil = 4; 266 | bullet = new LaserBulletType(){{ 267 | damage = 400; 268 | length = 8 * 40; 269 | width = 8 * 8; 270 | lifetime = 65; 271 | shootEffect = HMFx.laserCharge; 272 | lightningSpacing = 35; 273 | lightningLength = 5; 274 | lightningDelay = 1.1f; 275 | lightningLengthRand = 15; 276 | lightningDamage = 50; 277 | lightningAngleRand = 40; 278 | lightningColor = lightColor = Pal.sapBullet; 279 | largeHit = true; 280 | sideAngle = 15; 281 | sideWidth = 0; 282 | sideLength = 0; 283 | colors = new Color[]{Pal.sapBulletBack, Pal.sapBullet, Color.white}; 284 | }}; 285 | reload = 60 * 5; 286 | cooldownTime = 60 * 5; 287 | shootStatusDuration = 60; 288 | shootStatus = StatusEffects.unmoving; 289 | shake = 14; 290 | shootSound = Sounds.laserblast; 291 | chargeSound = Sounds.lasercharge; 292 | }}, 293 | 294 | new Weapon("heavymachineryjava-eteriusArtillery"){{ 295 | x = 74 / 4; 296 | y = -76 / 4; 297 | reload = 30; 298 | shootSound = Sounds.shootSnap; 299 | recoil = 3; 300 | rotate = true; 301 | bullet = new ArtilleryBulletType(){{ 302 | damage = 40; 303 | splashDamage = 20; 304 | splashDamageRadius = 8 * 6; 305 | lifetime = 90; 306 | speed = 2.3f; 307 | height = 18; 308 | width = 16; 309 | frontColor = Pal.sapBullet; 310 | backColor = Pal.sapBulletBack; 311 | fragBullets = 5; 312 | fragBullet = new MissileBulletType(){{ 313 | damage = 50; 314 | speed = 2.3f; 315 | homingPower = 4; 316 | frontColor = trailColor = Pal.sapBullet; 317 | backColor = Pal.sapBulletBack; 318 | height = 10; 319 | width = 8; 320 | splashDamage = 20; 321 | splashDamageRadius = 8 * 5; 322 | lifetime = 60; 323 | }}; 324 | status = StatusEffects.sapped; 325 | statusDuration = 60 * 7; 326 | }}; 327 | }} 328 | ); 329 | }}; 330 | 331 | princeps = new UnitType("princeps"){{ 332 | aiController = DisabledPredictAi::new; 333 | constructor = MechUnit::create; 334 | speed = 0.8f; 335 | hitSize = 9; 336 | health = 250; 337 | maxRange = 140; 338 | range = 140; 339 | targetAir = true; 340 | armor = 3; 341 | weapons.add( 342 | new Weapon("heavymachineryjava-princepsWeapon"){{ 343 | x = 5; 344 | y = 0; 345 | top = false; 346 | reload = 15; 347 | ejectEffect = Fx.lightningShoot; 348 | shootSound = Sounds.laser; 349 | bullet = HMBullets.standardOverseer; 350 | }} 351 | ); 352 | }}; 353 | 354 | procurator = new UnitType("procurator"){{ 355 | aiController = DisabledPredictAi::new; 356 | constructor = MechUnit::create; 357 | speed = 0.6f; 358 | hitSize = 13.375f; 359 | health = 500; 360 | maxRange = 300; 361 | range = 300; 362 | targetAir = true; 363 | armor = 5f; 364 | 365 | weapons.add( 366 | new Weapon("heavymachineryjava-procuratorWeapon"){{ 367 | x = 25 / 4; 368 | y = 3 / 4; 369 | top = false; 370 | reload = 25; 371 | ejectEffect = Fx.lightningShoot; 372 | shootSound = Sounds.laser; 373 | bullet = HMBullets.mediumOverseer; 374 | }} 375 | ); 376 | }}; 377 | 378 | inductor = new UnitType("inductor"){{ 379 | aiController = DisabledPredictAi::new; 380 | constructor = MechUnit::create; 381 | health = 600; 382 | speed = 0.56f; 383 | hitSize = 17.625f; 384 | drag = 0.4f; 385 | range = 350; 386 | maxRange = 350; 387 | singleTarget = true; 388 | legCount = 6; 389 | legLength = 9; 390 | legForwardScl = 0.6f; 391 | legMoveSpace = 1.4f; 392 | hovering = true; 393 | armor = 6; 394 | allowLegStep = true; 395 | groundLayer = Layer.legUnit; 396 | 397 | weapons.add( 398 | new Weapon("heavymachineryjava-inductorShotgun"){{ 399 | x = 36 / 4; 400 | y = 1 / 4; 401 | reload = 60; 402 | top = false; 403 | ejectEffect = Fx.lightningShoot; 404 | shootSound = Sounds.laser; 405 | shoot.shots = 4; 406 | inaccuracy = 15; 407 | bullet = HMBullets.mediumOverseer; 408 | }}, 409 | 410 | new Weapon("heavymachineryjava-inductorArtillery"){{ 411 | x = 0; 412 | y = -21 / 4; 413 | reload = 190; 414 | mirror = false; 415 | rotate = true; 416 | rotateSpeed = 3.5f; 417 | ejectEffect = Fx.lightningShoot; 418 | shootSound = Sounds.laser; 419 | bullet = HMBullets.mediumOrbiter; 420 | recoil = 4; 421 | }} 422 | ); 423 | }}; 424 | 425 | pugione = new UnitType("pugione"){{ 426 | speed = 0.6f; 427 | hitSize = 11; 428 | health = 300; 429 | maxRange = 120; 430 | range = 120; 431 | 432 | targetAir = false; 433 | armor = 3; 434 | aiController = GroundAI::new; 435 | constructor = MechUnit::create; 436 | 437 | weapons.add( 438 | new Weapon("heavymachineryjava-pugioneWeapon"){{ 439 | reload = 20; 440 | x = 5; 441 | y = 0; 442 | top = false; 443 | ejectEffect = Fx.none; 444 | shootSound = Sounds.shotgun; 445 | shootY = 4.75f; 446 | recoil = -4; //negative so it looks like it's punching 447 | range = 80; 448 | soundPitchMin = 0.42f; 449 | soundPitchMax = 1.74f; 450 | rotate = true; 451 | rotateSpeed = 60; 452 | bullet = HMBullets.standardSpike; 453 | }} 454 | ); 455 | }}; 456 | 457 | mucro = new UnitType("mucro"){{ 458 | speed = 0.45f; 459 | hitSize = 11.75f; 460 | health = 675; 461 | targetAir = false; 462 | maxRange = 170; 463 | range = 170; 464 | 465 | armor = 4; 466 | aiController = GroundAI::new; 467 | constructor = MechUnit::create; 468 | 469 | weapons.add( 470 | new Weapon("heavymachineryjava-mucroWeapon"){{ 471 | x = 24 / 4; 472 | y = 0; 473 | reload = 30; 474 | top = false; 475 | ejectEffect = Fx.none; 476 | shootSound = Sounds.shotgun; 477 | shootY = 30 / 4; 478 | recoil = -4; //negative so it looks like it's punching 479 | targetAir = false; 480 | soundPitchMin = 0.42f; 481 | soundPitchMax = 1.74f; 482 | rotate = true; 483 | rotateSpeed = 60f; 484 | bullet = HMBullets.mediumSpike; 485 | shoot = new ShootSpread(4, 22.5f); 486 | shoot.shotDelay = 5; 487 | }} 488 | ); 489 | }}; 490 | 491 | tragula = new UnitType("tragula"){{ 492 | speed = 0.4f; 493 | hitSize = 15; 494 | health = 1175; 495 | targetAir = false; 496 | maxRange = 180; 497 | range = 180; 498 | armor = 9; 499 | mechFrontSway = 0.55f; 500 | aiController = GroundAI::new; 501 | constructor = MechUnit::create; 502 | 503 | weapons.add( 504 | new Weapon("heavymachineryjava-tragulaWeapon"){{ 505 | x = 8; 506 | y = 1; 507 | reload = 40; 508 | top = false; 509 | ejectEffect = Fx.none; 510 | shootSound = Sounds.shotgun; 511 | shootY = 35 / 4; 512 | recoil = -4; //negative so it looks like it's punching 513 | targetAir = false; 514 | soundPitchMin = 0.42f; 515 | soundPitchMax = 1.74f; 516 | rotate = true; 517 | rotateSpeed = 60; 518 | bullet = HMBullets.highSpike; 519 | }} 520 | ); 521 | }}; 522 | 523 | lucius = new UnitType("lucius"){{ 524 | speed = 0.35f; 525 | hitSize = 22.5f; 526 | health = 12000; 527 | targetAir = false; 528 | maxRange = 190; 529 | range = 190; 530 | armor = 12; 531 | canDrown = false; 532 | mechFrontSway = 1; 533 | mechStepParticles = true; 534 | stepShake = 0.15f; 535 | aiController = GroundAI::new; 536 | constructor = MechUnit::create; 537 | 538 | weapons.add( 539 | new Weapon("heavymachineryjava-luciusWeapon"){{ 540 | x = 44 / 4; 541 | y = 1 / 4; 542 | reload = 20; 543 | top = false; 544 | ejectEffect = Fx.none; 545 | shootSound = Sounds.shotgun; 546 | shootY = 43 / 4; 547 | recoil = -4; //negative so it looks like it's punching 548 | targetAir = false; 549 | soundPitchMin = 0.42f; 550 | soundPitchMax = 1.74f; 551 | rotate = true; 552 | rotateSpeed = 60; 553 | bullet = HMBullets.luciusBullet; 554 | }}, 555 | new Weapon("heavymachineryjava-earthBend"){{ 556 | x = 0; 557 | y = 0; 558 | reload = 120; 559 | mirror = false; 560 | top = false; 561 | ejectEffect = Fx.none; 562 | shootSound = Sounds.place; 563 | shootY = 35 / 4; 564 | targetAir = false; 565 | soundPitchMin = 0.42f; 566 | soundPitchMax = 1; 567 | rotate = true; 568 | rotateSpeed = 60; 569 | bullet = new GroundSpikeBulletType(){{ 570 | shootEffect = Fx.none; 571 | speed = 2.5f; 572 | lifetime = 60; 573 | groundBullet = HMBullets.standardSpike; 574 | groundEffect = HMFx.earthDust; 575 | groundBullets = 6; 576 | groundBulletST = 9.375f; 577 | groundEffectST = 5; 578 | groundBulletSpacing = 22.5f; 579 | }}; 580 | }} 581 | ); 582 | }}; 583 | 584 | machaera = new UnitType("machaera"){{ 585 | speed = 0.3f; 586 | hitSize = 31.75f; 587 | health = 16000; 588 | targetAir = false; 589 | maxRange = 220; 590 | range = 220; 591 | armor = 16; 592 | canDrown = false; 593 | mechFrontSway = 1.79f; 594 | mechSideSway = 0.6f; 595 | mechStepParticles = true; 596 | stepShake = 0.15f; 597 | aiController = GroundAI::new; 598 | constructor = MechUnit::create; 599 | 600 | weapons.add( 601 | new Weapon("heavymachineryjava-machaeraWeapon"){{ 602 | x = 75 / 4; 603 | y = -6 / 4; 604 | reload = 35; 605 | top = false; 606 | ejectEffect = Fx.none; 607 | shootSound = Sounds.shotgun; 608 | shootY = 62 / 4; 609 | recoil = -5; 610 | targetAir = false; 611 | soundPitchMin = 0.42f; 612 | soundPitchMax = 1.74f; 613 | rotate = true; 614 | rotateSpeed = 60; 615 | 616 | shoot.shots = 2; 617 | shoot.shotDelay = 5; 618 | 619 | bullet = HMBullets.machaeraBullet; 620 | inaccuracy = 10; 621 | }}, 622 | new Weapon("heavymachineryjava-earthBendII"){{ 623 | x = 0; 624 | y = 0; 625 | reload = 120; 626 | mirror = false; 627 | top = false; 628 | ejectEffect = Fx.none; 629 | shootSound = Sounds.place; 630 | shootY = 35 / 4; 631 | targetAir = false; 632 | soundPitchMin = 0.42f; 633 | soundPitchMax = 1; 634 | rotate = true; 635 | rotateSpeed = 60; 636 | bullet = new GroundSpikeBulletType(){{ 637 | shootEffect = Fx.none; 638 | speed = 2.5f; 639 | lifetime = 60; 640 | groundBullet = HMBullets.mediumSpike; 641 | groundEffect = HMFx.earthDustII; 642 | groundBullets = 6; 643 | groundBulletST = 6.25f; 644 | groundEffectST = 5; 645 | groundBulletSpacing = 22.5f; 646 | }}; 647 | }} 648 | ); 649 | }}; 650 | }; 651 | }; 652 | -------------------------------------------------------------------------------- /src/heav/entities/abilities/LaserMoveAbility.java: -------------------------------------------------------------------------------- 1 | package heav.entities.abilities; 2 | 3 | import arc.math.*; 4 | import mindustry.gen.*; 5 | import mindustry.content.Bullets; 6 | import mindustry.entities.abilities.Ability; 7 | import mindustry.entities.bullet.BulletType; 8 | 9 | public class LaserMoveAbility extends Ability { 10 | protected Bullet bullet = null; 11 | public BulletType laser = Bullets.placeholder; 12 | public float offsetX = 0f; 13 | public float offsetY = 0f; 14 | public float min = 2f; 15 | public float max = 5f; 16 | 17 | public LaserMoveAbility(BulletType laser, float offsetX, float offsetY, float min, float max){ 18 | this.laser = laser; 19 | this.offsetX = offsetX; 20 | this.min = min; 21 | this.max = max; 22 | } 23 | 24 | @Override 25 | public void update(Unit unit){ 26 | float scl = Mathf.clamp((unit.vel.len() - min) / (max - min)); 27 | float bx = unit.x + Angles.trnsx(unit.rotation, offsetX); 28 | float by = unit.y + Angles.trnsy(unit.rotation, offsetX); 29 | if(bullet != null){ 30 | bullet.set(bx, by); 31 | bullet.rotation(unit.rotation); 32 | bullet.time = 0f; 33 | } 34 | if(scl >= 0.2f){ 35 | if(bullet == null){ 36 | bullet = laser.create(unit, bx, by, unit.rotation); 37 | } 38 | }else{ 39 | bullet = null; 40 | } 41 | super.update(unit); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/heav/entities/bullet/GroundSpikeBulletType.java: -------------------------------------------------------------------------------- 1 | package heav.entities.bullet; 2 | 3 | import mindustry.gen.*; 4 | import arc.graphics.Color; 5 | import mindustry.content.*; 6 | import mindustry.entities.*; 7 | import mindustry.entities.bullet.*; 8 | 9 | public class GroundSpikeBulletType extends BasicBulletType{ 10 | public float groundEffectST = 0f; 11 | public float groundBulletSpacing = 0f; 12 | public float groundBulletST = 0f; 13 | public Effect groundEffect = Fx.none; 14 | public BulletType groundBullet = Bullets.placeholder; 15 | public int groundBullets = 2; 16 | 17 | public GroundSpikeBulletType(float speed, float damage, String sprite){ 18 | super(speed, damage, sprite); 19 | absorbable = false; 20 | reflectable = false; 21 | hittable = false; 22 | collides = false; 23 | collidesGround = false; 24 | collidesAir = false; 25 | collidesTiles = false; 26 | hitEffect = Fx.none; 27 | despawnEffect = Fx.none; 28 | shootEffect = Fx.none; 29 | smokeEffect = Fx.none; 30 | } 31 | 32 | public GroundSpikeBulletType(float speed, float damage){ 33 | this(speed, damage, "bullet"); 34 | } 35 | 36 | public GroundSpikeBulletType(){ 37 | this(1, 1); 38 | } 39 | @Override 40 | public void drawLight(Bullet b){ 41 | //nothing 42 | }; 43 | 44 | @Override 45 | public void draw(Bullet b){ 46 | //nothing 47 | }; 48 | 49 | @Override 50 | public void update(Bullet b){ 51 | Color col = b.tileOn().floor().mapColor; 52 | if(b.timer.get(0, groundEffectST)){ 53 | if(groundEffect != null && groundEffect != Fx.none){ 54 | groundEffect.at(b.x, b.y, b.rotation(), col); 55 | } 56 | Sounds.place.at(b.x, b.y, 0.42f, 1f); 57 | } 58 | 59 | if(b.timer.get(1, groundBulletST)){ 60 | groundEffect.at(b.x, b.y, b.rotation(), col); 61 | for(int i = 0; i < groundBullets; i++){ 62 | float angle = b.rotation() + (i - (groundBullets / 2)) * groundBulletSpacing; 63 | groundBullet.create(b, b.x, b.y, angle); 64 | }; 65 | }; 66 | }; 67 | 68 | @Override 69 | public float estimateDPS(){ 70 | float sum = super.estimateDPS(); 71 | if(groundBullet != null && groundBullet != this){ 72 | sum += (groundBullet.estimateDPS() * groundBullets / 2f) * (lifetime / groundBulletST); 73 | } 74 | return sum; 75 | }; 76 | } 77 | -------------------------------------------------------------------------------- /src/heav/entities/bullet/OrbiterBulletType.java: -------------------------------------------------------------------------------- 1 | package heav.entities.bullet; 2 | 3 | import arc.math.*; 4 | import arc.struct.*; 5 | import arc.util.*; 6 | import arc.graphics.g2d.*; 7 | import mindustry.graphics.*; 8 | import mindustry.gen.*; 9 | import mindustry.entities.*; 10 | import mindustry.entities.bullet.*; 11 | import mindustry.content.*; 12 | 13 | public class OrbiterBulletType extends OverseerBulletType{ 14 | public int orbiters = 4; 15 | public int orbiterTrailLength = 15; 16 | public float orbitSpeed = 1f; 17 | public float orbitRadius = 16f; 18 | public float orbiterST = 25f; 19 | public float orbiterRadius = 4f; 20 | public float orbiterTrailWidth = 2f; 21 | public Effect orbiterTrailEffect = Fx.none; 22 | public BulletType orbiter = Bullets.placeholder; 23 | 24 | public OrbiterBulletType(float speed, float damage, String sprite){ 25 | super(speed, damage, sprite); 26 | homeStop = true; 27 | }; 28 | 29 | public OrbiterBulletType(float speed, float damage){ 30 | this(speed, damage, "bullet"); 31 | }; 32 | 33 | @Override 34 | public void init(Bullet b){ 35 | if(b.data == null){ 36 | Seq trails = new Seq(); 37 | FloatSeq oX = new FloatSeq(), oY = new FloatSeq(); 38 | for(int i = 0; i < orbiters; i++){ 39 | oX.add(b.x); 40 | oY.add(b.y); 41 | trails.add(new Trail(orbiterTrailLength)); 42 | }; 43 | b.data = new OrbiterBulletData(true, trails, oX, oY); 44 | } 45 | super.init(b); 46 | }; 47 | 48 | @Override 49 | public void update(Bullet b){ 50 | if(!(b.data instanceof OrbiterBulletData d)) return; 51 | float angle = (360f / orbiters); 52 | for(int i = 0; i < d.trails.size; i++){ 53 | d.oX.set(i, b.x + Angles.trnsx(angle * i + (orbitSpeed * Time.time), orbitRadius)); 54 | d.oY.set(i, b.y + Angles.trnsy(angle * i + (orbitSpeed * Time.time), orbitRadius)); 55 | if(orbiterTrailEffect != Fx.none && orbiterTrailEffect != null){ 56 | if(Mathf.chanceDelta(1)){ 57 | orbiterTrailEffect.at(d.oX.get(i), d.oY.get(i), trailParam, trailColor); 58 | }; 59 | }else{ 60 | d.trails.get(i).update(d.oX.get(i), d.oY.get(i)); 61 | } 62 | }; 63 | 64 | if(b.timer(0, orbiterST)){ 65 | for(int i = 0; i < d.trails.size; i++){ 66 | orbiter.create(b, d.oX.get(i), d.oY.get(i), b.rotation()); 67 | }; 68 | }; 69 | super.update(b); 70 | }; 71 | 72 | @Override 73 | public void removed(Bullet b){ 74 | if(trailLength > 0 && b.trail != null && b.trail.size() > 0){ 75 | Fx.trailFade.at(b.x, b.y, trailWidth, trailColor, b.trail.copy()); 76 | } 77 | } 78 | 79 | @Override 80 | public void draw(Bullet b){ 81 | if(!(b.data instanceof OrbiterBulletData d)) return; 82 | for(int i = 0; i < d.trails.size; i++){ 83 | if(!(trailEffect != Fx.none && trailEffect != null)){ 84 | d.trails.get(i).draw(backColor, orbiterTrailWidth * b.fout()); 85 | } 86 | Draw.color(backColor); 87 | Fill.circle(d.oX.get(i), d.oY.get(i), orbiterRadius * b.fout()); 88 | } 89 | super.draw(b); 90 | } 91 | 92 | public static class OrbiterBulletData extends OverseerBulletType.OverseerBulletData{ 93 | public Seq trails; 94 | public FloatSeq oX, oY; 95 | 96 | public OrbiterBulletData(boolean home, Seq trails, FloatSeq oX, FloatSeq oY){ 97 | super(home); 98 | this.oX = oX; 99 | this.oY = oY; 100 | this.trails = trails; 101 | } 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /src/heav/entities/bullet/OverseerBulletType.java: -------------------------------------------------------------------------------- 1 | package heav.entities.bullet; 2 | 3 | import arc.math.*; 4 | import arc.graphics.*; 5 | import arc.graphics.g2d.*; 6 | import arc.util.*; 7 | import mindustry.entities.bullet.*; 8 | import mindustry.gen.*; 9 | import mindustry.content.*; 10 | import mindustry.graphics.*; 11 | import mindustry.world.blocks.defense.turrets.*; 12 | 13 | public class OverseerBulletType extends BasicBulletType{ 14 | public float targetTime = 15f; 15 | public boolean homeStop = false; 16 | public Color trailColor = Pal.lancerLaser; 17 | 18 | public OverseerBulletType(float speed, float damage, String sprite){ 19 | super(speed, damage, sprite); 20 | trailEffect = Fx.none; 21 | trailLength = 15; 22 | trailWidth = -1f; 23 | trailColor = Pal.lancerLaser; 24 | pierce = true; 25 | pierceCap = 10; 26 | homingPower = 10f; 27 | hitEffect = Fx.hitLancer; 28 | despawnEffect = Fx.hitLancer; 29 | hitColor = Pal.lancerLaser; 30 | frontColor = Color.white; 31 | backColor = Pal.lancerLaser; 32 | } 33 | 34 | public OverseerBulletType(float speed, float damage){ 35 | this(speed, damage, "bullet"); 36 | } 37 | 38 | @Override 39 | public void init(){ 40 | super.init(); 41 | if(trailWidth < 0f) trailWidth = width * (10f / 52f); //Should match up with normal bullet sprite yep from meep 42 | }; 43 | 44 | @Override 45 | public void init(Bullet b){ 46 | if(b.data == null){ 47 | b.data = new OverseerBulletData(true); 48 | } 49 | super.init(b); 50 | } 51 | 52 | @Override 53 | public void update(Bullet b){ 54 | if(!(b.data instanceof OverseerBulletData d)) return; 55 | updateTrail(b); 56 | 57 | float tx = 0, ty = 0; 58 | if(b.owner instanceof Unit u){ 59 | tx = u.aimX; 60 | ty = u.aimY; 61 | }; 62 | if(b.owner instanceof Turret.TurretBuild t){ 63 | tx = t.targetPos.x; 64 | ty = t.targetPos.y; 65 | }; 66 | 67 | float ang = Angles.moveToward(b.rotation(), b.angleTo(tx, ty), homingPower * Time.delta * 50f); 68 | 69 | if(b.within(tx, ty, hitSize / 2f)){ 70 | if(!homeStop){ 71 | d.home = false; 72 | } 73 | } 74 | 75 | if(homingPower > 0.0001f && b.time >= homingDelay){ 76 | if(b.timer.get(0, targetTime)){ 77 | if(d.home){ 78 | b.rotation(ang); 79 | b.vel.setAngle(ang); 80 | } 81 | } 82 | } 83 | 84 | if(weaveMag > 0){ 85 | b.vel.rotate(Mathf.sin(b.time + Mathf.PI * weaveScale/2f, weaveScale, weaveMag * (Mathf.randomSeed(b.id, 0, 1) == 1 ? -1 : 1)) * Time.delta); 86 | } 87 | 88 | if(trailEffect != Fx.none || trailEffect != null){ 89 | if(Mathf.chanceDelta(1)){ 90 | trailEffect.at(b.x, b.y, trailParam, trailColor); 91 | }; 92 | } 93 | } 94 | 95 | @Override 96 | public void drawTrail(Bullet b){ 97 | if(trailLength > 0 && b.trail != null){ 98 | //TODO draw below bullets? 99 | float z = Draw.z(); 100 | Draw.z(z - 0.0001f); 101 | b.trail.draw(trailColor, trailWidth); 102 | Draw.z(z); 103 | } 104 | } 105 | 106 | public static class OverseerBulletData{ 107 | public boolean home; 108 | 109 | public OverseerBulletData(boolean home){ 110 | this.home = home; 111 | } 112 | } 113 | } 114 | -------------------------------------------------------------------------------- /src/heav/entities/bullet/PortalBulletType.java: -------------------------------------------------------------------------------- 1 | package heav.entities.bullet; 2 | 3 | import arc.graphics.Color; 4 | import arc.graphics.g2d.Draw; 5 | import arc.math.*; 6 | import arc.math.geom.Vec2; 7 | import arc.util.*; 8 | import mindustry.content.Bullets; 9 | import mindustry.entities.*; 10 | import mindustry.entities.Units.Sortf; 11 | import mindustry.entities.bullet.*; 12 | import mindustry.gen.*; 13 | 14 | //wi made a bullet shoot a bullet aaaa 15 | public class PortalBulletType extends BasicBulletType{ 16 | public BulletType bullet = Bullets.placeholder; 17 | public float growTime = 10f, fadeTime = 10f; 18 | public float shootTime = 40f; 19 | public float radius = 3f; 20 | public float rotateSpeed = 4f; //why you ask i dont want it instant 21 | public float range = 32f; 22 | public float inaccuracy = 3f, spread = 1f; 23 | public int shots = 1; 24 | public Sortf unitSort = UnitSorts.closest; 25 | 26 | 27 | public PortalBulletType(float speed, float damage, String sprite){ 28 | super(speed, damage, sprite); 29 | spin = 5f; 30 | }; 31 | 32 | public PortalBulletType(float speed, float damage){ 33 | this(speed, damage, "bullet"); 34 | } 35 | 36 | public PortalBulletType(){ 37 | this(1f, 1f); 38 | } 39 | 40 | @Override 41 | public void init(Bullet b){ 42 | b.data = new PortalBulletData(); 43 | super.init(b); 44 | } 45 | 46 | public void targetPosition(Bullet b, Posc pos){ 47 | if(pos == null) return; 48 | var offset = Tmp.v1.setZero(); 49 | 50 | if(b.data instanceof PortalBulletData data){ 51 | data.targetPos.set(Predict.intercept(b, pos, offset.x, offset.y, bullet.speed <= 0.01f ? 99999999f : bullet.speed)); 52 | 53 | if(data.targetPos.isZero()){ 54 | data.targetPos.set(pos); 55 | } 56 | } 57 | } 58 | 59 | public void turnToTarget(Bullet b, float targetRot){ 60 | if(b.data instanceof PortalBulletData data){ 61 | //dont want to rotate the bullet it will be h 62 | data.rotation = Angles.moveToward(data.rotation, targetRot, rotateSpeed * Time.delta); 63 | } 64 | } 65 | 66 | protected void findTarget(Bullet b){ 67 | if(!(b.data instanceof PortalBulletData data)) return; 68 | if(collidesAir && !collidesGround){ 69 | data.target = Units.bestEnemy(b.team, b.x, b.y, range, e -> !e.dead() && !e.isGrounded(), unitSort); 70 | }else{ 71 | data.target = Units.bestTarget(b.team, b.x, b.y, range, e -> !e.dead() && (e.isGrounded() || collidesAir) && (!e.isGrounded() || collidesGround), g -> collidesGround, unitSort); 72 | 73 | if(data.target == null && healPercent != 0){ 74 | data.target = Units.findAllyTile(b.team, b.x, b.y, range, t -> t.damaged()); 75 | } 76 | } 77 | } 78 | 79 | @Override 80 | public void update(Bullet b){ 81 | if(!(b.data instanceof PortalBulletData data)) return; 82 | 83 | findTarget(b); 84 | targetPosition(b, data.target); 85 | 86 | if(Float.isNaN(data.rotation)) data.rotation = 0; 87 | 88 | turnToTarget(b, b.angleTo(data.targetPos)); 89 | 90 | if(b.timer(0, shootTime)){ 91 | for (int i = 0; i < shots; i++) { 92 | bullet.create(b, b.x, b.y, data.rotation + Mathf.range(inaccuracy + bullet.inaccuracy) + (i - (int)(shots / 2f)) * spread); 93 | } 94 | } 95 | } 96 | 97 | @Override 98 | public void draw(Bullet b){ 99 | float fin = Mathf.curve(b.fin(), 0, growTime / b.lifetime); 100 | float fout = 1 - Mathf.curve(b.fin(), (b.lifetime - fadeTime) / b.lifetime, 1); 101 | float size = fin * fout * radius; 102 | float offset = -90 + (spin != 0 ? Mathf.randomSeed(b.id, 360) + b.time * spin : 0); 103 | 104 | Color mix = Tmp.c1.set(mixColorFrom).lerp(mixColorTo, b.fin()); 105 | 106 | Draw.mixcol(mix, mix.a); 107 | 108 | Draw.color(backColor); 109 | Draw.rect(backRegion, b.x, b.y, size, size, b.rotation() + offset); 110 | Draw.color(frontColor); 111 | Draw.rect(frontRegion, b.x, b.y, size, size, b.rotation() + offset); 112 | 113 | Draw.reset(); 114 | } 115 | 116 | public class PortalBulletData { 117 | public Vec2 targetPos = new Vec2(); 118 | public float rotation = 0; 119 | public @Nullable Posc target; 120 | 121 | public PortalBulletData(){ 122 | } 123 | } 124 | } 125 | -------------------------------------------------------------------------------- /src/heav/entities/bullet/RandSpriteBulletType.java: -------------------------------------------------------------------------------- 1 | package heav.entities.bullet; 2 | 3 | import arc.Core; 4 | import arc.graphics.Color; 5 | import arc.graphics.g2d.Draw; 6 | import arc.graphics.g2d.TextureRegion; 7 | import arc.struct.Seq; 8 | import arc.math.*; 9 | import arc.util.*; 10 | import mindustry.content.*; 11 | import mindustry.entities.*; 12 | import mindustry.entities.bullet.*; 13 | import mindustry.gen.*; 14 | import mindustry.graphics.*; 15 | 16 | public class RandSpriteBulletType extends BasicBulletType{ 17 | public int variants = 5; 18 | public float critChance = 0.25f, critMultiplier = 2f; 19 | public Effect critTrail = Fx.none, spawnFx = Fx.none; 20 | 21 | Seq frontRegions = Seq.with(), backRegions = Seq.with(); 22 | 23 | public RandSpriteBulletType(float speed, float damage, String sprite){ 24 | super(speed, damage, sprite); 25 | pierce = true; 26 | pierceBuilding = true; 27 | trailLength = 15; 28 | trailWidth = 10f; 29 | trailColor = Pal.heal; 30 | ammoMultiplier = 1; 31 | frontColor = Color.white; 32 | backColor = Pal.heal; 33 | hitColor = Pal.heal; 34 | shootEffect = Fx.none; 35 | width = 8f * 3f; 36 | height = 8f * 3f; 37 | shrinkX = 0f; 38 | shrinkY = 0f; 39 | } 40 | 41 | public RandSpriteBulletType(float speed, float damage){ 42 | this(speed, damage, "bullet"); 43 | } 44 | 45 | @Override 46 | public void load(){ 47 | super.load(); 48 | if(variants > 0){ 49 | for(int i = 0; i < variants; i++){ 50 | backRegions.add(Core.atlas.find(sprite + "-back-" + i, backRegion)); 51 | frontRegions.add(Core.atlas.find(sprite + "-" + i, frontRegion)); 52 | } 53 | }else{ 54 | backRegions.add(backRegion); 55 | frontRegions.add(frontRegion); 56 | } 57 | }; 58 | 59 | @Override 60 | public void init(Bullet b){ 61 | if(b.data == null){ 62 | int ind = frontRegions.indexOf(frontRegions.random()); 63 | if(Mathf.chance(critChance)){ 64 | b.data = new RandSpriteBulletData(frontRegions.get(ind), backRegions.get(ind), true); 65 | }else{ 66 | b.data = new RandSpriteBulletData(frontRegions.get(ind), backRegions.get(ind), false); 67 | } 68 | if(((RandSpriteBulletData)b.data).crit) b.damage *= critMultiplier; 69 | } 70 | 71 | if(spawnFx != null || spawnFx != Fx.none){ 72 | spawnFx.at(b); 73 | } 74 | super.init(b); 75 | }; 76 | 77 | @Override 78 | public void update(Bullet b){ 79 | if(!(b.data instanceof RandSpriteBulletData dat)) return; 80 | super.update(b); 81 | if(dat.crit && Mathf.chanceDelta(1)){ 82 | if(critTrail != null || critTrail != Fx.none){ 83 | critTrail.at(b); 84 | } 85 | } 86 | }; 87 | 88 | @Override 89 | public void draw(Bullet b){ 90 | if(!(b.data instanceof RandSpriteBulletData dat)) return; 91 | drawTrail(b); 92 | float height = this.height * ((1 - shrinkY) + shrinkY * b.fout()); 93 | float width = this.width * ((1 - shrinkX) + shrinkX * b.fout()); 94 | float offset = -90 + (spin != 0 ? Mathf.randomSeed(b.id, 360) + b.time * spin : 0); 95 | 96 | Color mix = Tmp.c1.set(mixColorFrom).lerp(mixColorTo, b.fin()); 97 | 98 | Draw.mixcol(mix, mix.a); 99 | 100 | Draw.color(backColor); 101 | Draw.rect(dat.spriteBack, b.x, b.y, width, height, b.rotation() + offset); 102 | Draw.color(frontColor); 103 | Draw.rect(dat.sprite, b.x, b.y, width, height, b.rotation() + offset); 104 | 105 | Draw.reset(); 106 | }; 107 | 108 | @Override 109 | public void drawTrail(Bullet b){ 110 | if(trailLength > 0 && b.trail != null){ 111 | // TODO draw below bullets? 112 | float z = Draw.z(); 113 | Draw.z(z - 0.0001f); 114 | b.trail.draw(trailColor, trailWidth); 115 | Draw.z(z); 116 | } 117 | } 118 | 119 | @Override 120 | public void removed(Bullet b){ 121 | if(trailLength > 0 && b.trail != null && b.trail.size() > 0){ 122 | Fx.trailFade.at(b.x, b.y, trailWidth, trailColor, b.trail.copy()); 123 | } 124 | } 125 | 126 | public static class RandSpriteBulletData{ 127 | public TextureRegion sprite; 128 | public TextureRegion spriteBack; 129 | public boolean crit; 130 | 131 | public RandSpriteBulletData(TextureRegion sprite, TextureRegion spriteBack, boolean crit){ 132 | this.sprite = sprite; 133 | this.spriteBack = spriteBack; 134 | this.crit = crit; 135 | } 136 | } 137 | } 138 | -------------------------------------------------------------------------------- /src/heav/entities/bullet/RayBulletType.java: -------------------------------------------------------------------------------- 1 | package heav.entities.bullet; 2 | 3 | import arc.graphics.*; 4 | import arc.math.*; 5 | import arc.math.geom.*; 6 | import arc.util.*; 7 | import arc.graphics.g2d.*; 8 | import mindustry.game.*; 9 | import mindustry.entities.*; 10 | import mindustry.entities.bullet.*; 11 | import mindustry.gen.*; 12 | import mindustry.graphics.*; 13 | import mindustry.content.*; 14 | 15 | //this is basically SapBulletType but Continuous 16 | 17 | public class RayBulletType extends BulletType { 18 | public float length = 100f; 19 | public float sapStrength = 0.5f; 20 | public Color[] colors = {Pal.lancerLaser, Color.white.cpy()}; 21 | public float width = 3f; 22 | public float force = 0.3f; 23 | public float scaledForce = 4f; 24 | public float fadeTime = 10f; 25 | public float growTime = 10f; 26 | public float[] widthScls = {1.8f, 1f}; 27 | 28 | public RayBulletType(float damage, float length){ 29 | super(0, damage); 30 | this.length = length; 31 | speed = 0f; 32 | despawnEffect = Fx.none; 33 | pierce = true; 34 | collides = false; 35 | hitSize = 0f; 36 | hittable = false; 37 | hitEffect = Fx.hitLiquid; 38 | lightColor = Pal.sap; 39 | lightOpacity = 0.6f; 40 | impact = true; 41 | } 42 | public RayBulletType(){ 43 | this(1f, 1f); 44 | } 45 | @Override 46 | public void draw(Bullet b){ 47 | if(b.data instanceof Position data){ 48 | Tmp.v1.set(data); 49 | 50 | float fin = Mathf.curve(b.fin(), 0, growTime / b.lifetime); 51 | float fout = 1 - Mathf.curve(b.fin(), (b.lifetime - fadeTime) / b.lifetime, 1); 52 | float lWidth = fin * fout * width; 53 | 54 | for(int i = 0; i < 2; i++){ 55 | Draw.color(colors[i]); 56 | Lines.stroke(lWidth * widthScls[i]); 57 | Lines.line(b.x, b.y, Tmp.v1.x, Tmp.v1.y, false); 58 | Fill.circle(b.x, b.y, Lines.getStroke() / 1.25f); 59 | Fill.circle(Tmp.v1.x, Tmp.v1.y, Lines.getStroke() / 1.25f); 60 | Draw.reset(); 61 | } 62 | 63 | Drawf.light(b.x, b.y, Tmp.v1.x, Tmp.v1.y, 15f * fin * fout + 5f, colors[1], lightOpacity); 64 | } 65 | } 66 | 67 | @Override 68 | public void drawLight(Bullet b){ 69 | //no light 70 | } 71 | 72 | public float range(){ 73 | return Math.max(length, maxRange); 74 | } 75 | 76 | @Override 77 | public void update(Bullet b){ 78 | super.init(b); 79 | Healthc target = Damage.linecast(b, b.x, b.y, b.rotation(), length); 80 | b.data = target; 81 | 82 | if(target != null){ 83 | float result = Math.max(Math.min(target.health(), damage), 0); 84 | 85 | if(b.owner instanceof Healthc h){ 86 | h.heal(result * sapStrength); 87 | } 88 | } 89 | 90 | if(target instanceof Hitboxc hit){ 91 | hit.collision(b, hit.x(), hit.y()); 92 | b.collision(hit, hit.x(), hit.y()); 93 | 94 | if(hit instanceof Unitc unit){ 95 | unit.impulse(Tmp.v3.set(hit).sub(b.x, b.y).nor().scl(-1 * (force + ((hit.dst(b) / range())) * scaledForce))); 96 | } 97 | 98 | }else if(target instanceof Building tile){ 99 | if(tile.collide(b)){ 100 | tile.collision(b); 101 | hit(b, tile.x, tile.y); 102 | } 103 | }else{ 104 | b.data = new Vec2().trns(b.rotation(), length).add(b.x, b.y); 105 | } 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /src/heav/maps/CaeruleumPlanetGenerator.java: -------------------------------------------------------------------------------- 1 | package heav.maps; 2 | 3 | import arc.struct.FloatSeq; 4 | import arc.struct.ObjectMap; 5 | import arc.struct.ObjectSet; 6 | import arc.math.Mathf; 7 | import arc.math.Rand; 8 | import arc.math.geom.*; 9 | import arc.struct.Seq; 10 | import arc.util.Tmp; 11 | import arc.util.noise.*; 12 | import arc.graphics.Color; 13 | import arc.math.Angles; 14 | import mindustry.world.Block; 15 | import mindustry.content.Blocks; 16 | import mindustry.content.Liquids; 17 | import mindustry.game.*; 18 | import mindustry.world.*; 19 | import mindustry.ai.Astar; 20 | import mindustry.ai.BaseRegistry.BasePart; 21 | import mindustry.maps.generators.BaseGenerator; 22 | import mindustry.maps.planet.SerpuloPlanetGenerator; 23 | import mindustry.type.Sector; 24 | 25 | import static mindustry.Vars.*; 26 | 27 | public class CaeruleumPlanetGenerator extends SerpuloPlanetGenerator{ 28 | BaseGenerator basegen = new BaseGenerator(); 29 | float scl = 5f; 30 | float waterOffset = 0.7f; 31 | static final int seed = 70; 32 | boolean genLakes = false; 33 | 34 | Block[][] arr = { 35 | {Blocks.water, Blocks.darksandWater, Blocks.darksand, Blocks.darksand, Blocks.darksand, Blocks.darksand, Blocks.darksand, Blocks.darksand, Blocks.darksand, Blocks.darksand, Blocks.darksandWater, Blocks.stone, Blocks.stone}, 36 | {Blocks.water, Blocks.darksandWater, Blocks.darksand, Blocks.darksand, Blocks.darksand, Blocks.darksand, Blocks.darksand, Blocks.darksand, Blocks.darksand, Blocks.darksandWater, Blocks.stone, Blocks.stone, Blocks.stone}, 37 | {Blocks.water, Blocks.darksandWater, Blocks.darksand, Blocks.darksand, Blocks.salt, Blocks.darksand, Blocks.darksand, Blocks.darksand, Blocks.darksand, Blocks.darksandWater, Blocks.stone, Blocks.stone, Blocks.stone}, 38 | {Blocks.water, Blocks.sandWater, Blocks.darksand, Blocks.salt, Blocks.salt, Blocks.salt, Blocks.darksand, Blocks.stone, Blocks.stone, Blocks.stone, Blocks.snow, Blocks.iceSnow, Blocks.ice}, 39 | {Blocks.deepwater, Blocks.water, Blocks.sandWater, Blocks.darksand, Blocks.salt, Blocks.darksand, Blocks.darksand, Blocks.basalt, Blocks.snow, Blocks.snow, Blocks.snow, Blocks.snow, Blocks.ice}, 40 | {Blocks.deepwater, Blocks.water, Blocks.sandWater, Blocks.darksand, Blocks.darksand, Blocks.darksand, Blocks.shale, Blocks.iceSnow, Blocks.snow, Blocks.snow, Blocks.ice, Blocks.snow, Blocks.ice}, 41 | {Blocks.deepwater, Blocks.sandWater, Blocks.darksand, Blocks.darksand, Blocks.shale, Blocks.shale, Blocks.snow, Blocks.basalt, Blocks.basalt, Blocks.basalt, Blocks.ice, Blocks.snow, Blocks.ice}, 42 | {Blocks.water, Blocks.darksandWater, Blocks.darksand, Blocks.darksand, Blocks.basalt, Blocks.shale, Blocks.basalt, Blocks.hotrock, Blocks.basalt, Blocks.ice, Blocks.snow, Blocks.ice, Blocks.ice}, 43 | {Blocks.darksandWater, Blocks.darksand, Blocks.darksand, Blocks.darksand, Blocks.shale, Blocks.shale, Blocks.snow, Blocks.basalt, Blocks.basalt, Blocks.ice, Blocks.snow, Blocks.ice, Blocks.ice}, 44 | {Blocks.darksandWater, Blocks.darksand, Blocks.darksand, Blocks.shale, Blocks.ice, Blocks.ice, Blocks.snow, Blocks.snow, Blocks.snow, Blocks.snow, Blocks.ice, Blocks.ice, Blocks.ice}, 45 | {Blocks.water, Blocks.darksandWater, Blocks.darksand, Blocks.shale, Blocks.shale, Blocks.ice, Blocks.ice, Blocks.snow, Blocks.snow, Blocks.ice, Blocks.ice, Blocks.ice, Blocks.ice}, 46 | {Blocks.darksandWater, Blocks.darksandWater, Blocks.darksand, Blocks.shale, Blocks.shale, Blocks.shale, Blocks.iceSnow, Blocks.snow, Blocks.ice, Blocks.ice, Blocks.ice, Blocks.ice, Blocks.ice}, 47 | {Blocks.darksandWater, Blocks.darksand, Blocks.snow, Blocks.ice, Blocks.iceSnow, Blocks.snow, Blocks.snow, Blocks.snow, Blocks.ice, Blocks.ice, Blocks.ice, Blocks.ice, Blocks.ice} 48 | }; 49 | 50 | float water = 2f / arr[0].length; 51 | 52 | ObjectMap dec = ObjectMap.of( 53 | Blocks.darksand, Blocks.darksand, 54 | Blocks.darksand, Blocks.darksand, 55 | Blocks.taintedWater, Blocks.water, 56 | Blocks.darksandTaintedWater, Blocks.darksandWater 57 | ); 58 | 59 | ObjectMap tars = ObjectMap.of( 60 | Blocks.sporeMoss, Blocks.shale, 61 | Blocks.moss, Blocks.shale 62 | ); 63 | 64 | @Override 65 | public float getHeight(Vec3 position) { 66 | float height = rawHeight(position); 67 | return Math.max(height, water); 68 | } 69 | 70 | @Override 71 | public Color getColor(Vec3 position) { 72 | Block block = getBlock(position); 73 | //replace salt with sand color 74 | if(block == Blocks.salt) return Blocks.salt.mapColor; 75 | return Tmp.c1.set(block.mapColor).a(1f - block.albedo); 76 | } 77 | 78 | float rawHeight(Vec3 position){ 79 | position = Tmp.v33.set(position).scl(scl); 80 | return (Mathf.pow(Simplex.noise3d(seed, 7, 0.5f, 1f/3f, position.x, position.y, position.z), 2.3f) + waterOffset) / (1f + waterOffset); 81 | } 82 | 83 | Block getBlock(Vec3 position){ 84 | float height = rawHeight(position); 85 | Tmp.v31.set(position); 86 | position = Tmp.v33.set(position).scl(scl); 87 | float rad = scl; 88 | float temp = Mathf.clamp(Math.abs(position.y * 2f) / (rad)); 89 | float tnoise = Simplex.noise3d(seed, 7, 0.56, 1f/3f, position.x, position.y + 999f, position.z); 90 | temp = Mathf.lerp(temp, tnoise, 0.5f); 91 | height *= 1.2f; 92 | height = Mathf.clamp(height); 93 | 94 | float tar = Simplex.noise3d(seed, 4, 0.55f, 1f/2f, position.x, position.y + 999f, position.z) * 0.3f + Tmp.v31.dst(0, 0, 1f) * 0.2f; 95 | 96 | Block res = arr[Mathf.clamp((int)(temp * arr.length), 0, arr[0].length - 1)][Mathf.clamp((int)(height * arr[0].length), 0, arr[0].length - 1)]; 97 | if(tar > 0.5f){ 98 | return tars.get(res, res); 99 | }else{ 100 | return res; 101 | } 102 | } 103 | 104 | @Override 105 | public void genTile(Vec3 position, TileGen tile){ 106 | tile.floor = getBlock(position); 107 | tile.block = tile.floor.asFloor().wall; 108 | 109 | if(Ridged.noise3d(1, position.x, position.y, position.z, 2, 22) > 0.31){ 110 | tile.block = Blocks.air; 111 | } 112 | } 113 | 114 | @Override 115 | public void postGenerate(Tiles tiles){ 116 | if(sector.hasEnemyBase()){ 117 | basegen.postGenerate(); 118 | } 119 | } 120 | 121 | protected void generate(){ 122 | class Room{ 123 | int x, y, radius; 124 | ObjectSet connected = new ObjectSet<>(); 125 | 126 | Room(int x, int y, int radius){ 127 | this.x = x; 128 | this.y = y; 129 | this.radius = radius; 130 | connected.add(this); 131 | } 132 | //For now no liquidStuff means no naval stuff 133 | void connect(Room to){ 134 | if(connected.contains(to)) return; 135 | connected.add(to); 136 | float nscl = rand.random(100f, 140f) * 6f; 137 | int stroke = rand.random(3, 9); 138 | brush(pathfind(x, y, to.x, to.y, tile -> (tile.solid() ? 50f : 0f) + noise(tile.x, tile.y, 2, 0.4f, 1f / nscl) * 500, Astar.manhattan), stroke); 139 | } 140 | } 141 | 142 | cells(4); 143 | distort(10f, 12f); 144 | 145 | float constraint = 1.3f; 146 | float radius = width / 2f / Mathf.sqrt3; 147 | int rooms = rand.random(2, 5); 148 | Seq roomseq = new Seq<>(); 149 | 150 | for(int i = 0; i < rooms; i++){ 151 | Tmp.v1.trns(rand.random(360f), rand.random(radius / constraint)); 152 | float rx = (width/2f + Tmp.v1.x); 153 | float ry = (height/2f + Tmp.v1.y); 154 | float maxrad = radius - Tmp.v1.len(); 155 | float rrad = Math.min(rand.random(9f, maxrad / 2f), 30f); 156 | roomseq.add(new Room((int)rx, (int)ry, (int)rrad)); 157 | } 158 | 159 | //check positions on the map to place the player spawn. this needs to be in the corner of the map 160 | Room spawn = null; 161 | Seq enemies = new Seq<>(); 162 | int enemySpawns = rand.random(1, Math.max((int)(sector.threat * 4), 1)); 163 | int offset = rand.nextInt(360); 164 | float length = width/2.55f - rand.random(13, 23); 165 | int angleStep = 5; 166 | int waterCheckRad = 5; 167 | for(int i = 0; i < 360; i+= angleStep){ 168 | int angle = offset + i; 169 | int cx = (int)(width/2 + Angles.trnsx(angle, length)); 170 | int cy = (int)(height/2 + Angles.trnsy(angle, length)); 171 | 172 | int waterTiles = 0; 173 | 174 | //check for water presence 175 | for(int rx = -waterCheckRad; rx <= waterCheckRad; rx++){ 176 | for(int ry = -waterCheckRad; ry <= waterCheckRad; ry++){ 177 | Tile tile = tiles.get(cx + rx, cy + ry); 178 | if(tile == null || tile.floor().liquidDrop != null){ 179 | waterTiles ++; 180 | } 181 | } 182 | } 183 | 184 | if(waterTiles <= 4 || (i + angleStep >= 360)){ 185 | roomseq.add(spawn = new Room(cx, cy, rand.random(8, 15))); 186 | 187 | for(int j = 0; j < enemySpawns; j++){ 188 | float enemyOffset = rand.range(60f); 189 | Tmp.v1.set(cx - width/2, cy - height/2).rotate(180f + enemyOffset).add(width/2, height/2); 190 | Room espawn = new Room((int)Tmp.v1.x, (int)Tmp.v1.y, rand.random(8, 16)); 191 | roomseq.add(espawn); 192 | enemies.add(espawn); 193 | } 194 | 195 | break; 196 | } 197 | } 198 | 199 | //clear radius around each room 200 | for(Room room : roomseq){ 201 | erase(room.x, room.y, room.radius); 202 | } 203 | 204 | //randomly connect rooms together 205 | int connections = rand.random(Math.max(rooms - 1, 1), rooms + 3); 206 | for(int i = 0; i < connections; i++){ 207 | roomseq.random(rand).connect(roomseq.random(rand)); 208 | } 209 | 210 | for(Room room : roomseq){ 211 | spawn.connect(room); 212 | } 213 | 214 | Room fspawn = spawn; 215 | 216 | cells(1); 217 | 218 | int tlen = tiles.width * tiles.height; 219 | int total = 0, waters = 0; 220 | 221 | for(int i = 0; i < tlen; i++){ 222 | Tile tile = tiles.geti(i); 223 | if(tile.block() == Blocks.air){ 224 | total ++; 225 | if(tile.floor().liquidDrop == Liquids.water){ 226 | waters ++; 227 | } 228 | } 229 | } 230 | 231 | boolean naval = (float)waters / total >= 0.19f; 232 | 233 | 234 | distort(10f, 6f); 235 | 236 | //rivers 237 | pass((x, y) -> { 238 | if(block.solid) return; 239 | 240 | Vec3 v = sector.rect.project(x, y); 241 | 242 | float rr = Simplex.noise2d(sector.id, (float)2, 0.6f, 1f / 7f, x, y) * 0.1f; 243 | float value = Ridged.noise3d(2, v.x, v.y, v.z, 1, 1f / 55f) + rr - rawHeight(v) * 0f; 244 | float rrscl = rr * 44 - 2; 245 | 246 | if(value > 0.17f && !Mathf.within(x, y, fspawn.x, fspawn.y, 12 + rrscl)){ 247 | boolean deep = value > 0.17f + 0.1f && !Mathf.within(x, y, fspawn.x, fspawn.y, 15 + rrscl); 248 | boolean spore = floor != Blocks.sand && floor != Blocks.salt; 249 | //do not place rivers on ice, they're frozen 250 | //ignore pre-existing liquids 251 | if(!(floor == Blocks.ice || floor == Blocks.iceSnow || floor == Blocks.snow || floor.asFloor().isLiquid)){ 252 | floor = spore ? 253 | (deep ? Blocks.taintedWater : Blocks.darksandTaintedWater) : 254 | (deep ? Blocks.water : 255 | (floor == Blocks.sand || floor == Blocks.salt ? Blocks.sandWater : Blocks.darksandWater)); 256 | } 257 | } 258 | }); 259 | 260 | 261 | Seq ores = Seq.with(Blocks.oreCopper, Blocks.oreLead); 262 | float poles = Math.abs(sector.tile.v.y); 263 | float nmag = 0.5f; 264 | float scl = 1f; 265 | float addscl = 1.3f; 266 | 267 | if(Simplex.noise3d(seed, 2, 0.5, scl, sector.tile.v.x, sector.tile.v.y, sector.tile.v.z)*nmag + poles > 0.25f*addscl){ 268 | ores.add(Blocks.oreCoal); 269 | } 270 | 271 | if(Simplex.noise3d(seed, 2, 0.5, scl, sector.tile.v.x + 1, sector.tile.v.y, sector.tile.v.z)*nmag + poles > 0.5f*addscl){ 272 | ores.add(Blocks.oreTitanium); 273 | } 274 | 275 | if(Simplex.noise3d(seed, 2, 0.5, scl, sector.tile.v.x + 2, sector.tile.v.y, sector.tile.v.z)*nmag + poles > 0.7f*addscl){ 276 | ores.add(Blocks.oreThorium); 277 | } 278 | 279 | if(rand.chance(0.25)){ 280 | ores.add(Blocks.oreScrap); 281 | } 282 | 283 | FloatSeq frequencies = new FloatSeq(); 284 | for(int i = 0; i < ores.size; i++){ 285 | frequencies.add(rand.random(-0.1f, 0.01f) - i * 0.01f + poles * 0.04f); 286 | } 287 | 288 | pass((x, y) -> { 289 | if(!floor.asFloor().hasSurface()) return; 290 | 291 | int offsetX = x - 4, offsetY = y + 23; 292 | for(int i = ores.size - 1; i >= 0; i--){ 293 | Block entry = ores.get(i); 294 | float freq = frequencies.get(i); 295 | if(Math.abs(0.5f - noise(offsetX, offsetY + i*999, 2, 0.7, (40 + i * 2))) > 0.22f + i*0.01 && 296 | Math.abs(0.5f - noise(offsetX, offsetY - i*999, 1, 1, (30 + i * 4))) > 0.37f + freq){ 297 | ore = entry; 298 | break; 299 | } 300 | } 301 | 302 | if(ore == Blocks.oreScrap && rand.chance(0.33)){ 303 | floor = Blocks.metalFloorDamaged; 304 | } 305 | }); 306 | 307 | trimDark(); 308 | 309 | median(2); 310 | 311 | inverseFloodFill(tiles.getn(spawn.x, spawn.y)); 312 | 313 | tech(); 314 | 315 | pass((x, y) -> { 316 | //tar 317 | if(floor == Blocks.darksand){ 318 | if(Math.abs(0.5f - noise(x - 40, y, 2, 0.7, 80)) > 0.25f && 319 | Math.abs(0.5f - noise(x, y + sector.id*10, 1, 1, 60)) > 0.41f && !(roomseq.contains(r -> Mathf.within(x, y, r.x, r.y, 15)))){ 320 | floor = Blocks.tar; 321 | } 322 | } 323 | 324 | //hotrock tweaks 325 | if(floor == Blocks.hotrock){ 326 | if(Math.abs(0.5f - noise(x - 90, y, 4, 0.8, 80)) > 0.035){ 327 | floor = Blocks.basalt; 328 | }else{ 329 | ore = Blocks.air; 330 | boolean all = true; 331 | for(Point2 p : Geometry.d4){ 332 | Tile other = tiles.get(x + p.x, y + p.y); 333 | if(other == null || (other.floor() != Blocks.hotrock && other.floor() != Blocks.magmarock)){ 334 | all = false; 335 | } 336 | } 337 | if(all){ 338 | floor = Blocks.magmarock; 339 | } 340 | } 341 | }else if(genLakes && floor != Blocks.basalt && floor != Blocks.ice && floor.asFloor().hasSurface()){ 342 | float noise = noise(x + 782, y, 5, 0.75f, 260f, 1f); 343 | if(noise > 0.67f && !roomseq.contains(e -> Mathf.within(x, y, e.x, e.y, 14))){ 344 | if(noise > 0.72f){ 345 | floor = noise > 0.78f ? Blocks.taintedWater : (floor == Blocks.sand ? Blocks.sandWater : Blocks.darksandTaintedWater); 346 | }else{ 347 | floor = (floor == Blocks.sand ? floor : Blocks.darksand); 348 | } 349 | } 350 | } 351 | 352 | //random stuff 353 | dec: { 354 | for(int i = 0; i < 4; i++){ 355 | Tile near = world.tile(x + Geometry.d4[i].x, y + Geometry.d4[i].y); 356 | if(near != null && near.block() != Blocks.air){ 357 | break dec; 358 | } 359 | } 360 | 361 | if(rand.chance(0.01) && floor.asFloor().hasSurface() && block == Blocks.air){ 362 | block = dec.get(floor, floor.asFloor().decoration); 363 | } 364 | } 365 | }); 366 | 367 | float difficulty = sector.threat; 368 | ints.clear(); 369 | ints.ensureCapacity(width * height / 4); 370 | 371 | int ruinCount = rand.random(-2, 4); 372 | if(ruinCount > 0){ 373 | int padding = 25; 374 | 375 | //create list of potential positions 376 | for(int x = padding; x < width - padding; x++){ 377 | for(int y = padding; y < height - padding; y++){ 378 | Tile tile = tiles.getn(x, y); 379 | if(!tile.solid() && (tile.drop() != null || tile.floor().liquidDrop != null)){ 380 | ints.add(tile.pos()); 381 | } 382 | } 383 | } 384 | 385 | ints.shuffle(rand); 386 | 387 | int placed = 0; 388 | float diffRange = 0.4f; 389 | //try each position 390 | for(int i = 0; i < ints.size && placed < ruinCount; i++){ 391 | int val = ints.items[i]; 392 | int x = Point2.x(val), y = Point2.y(val); 393 | 394 | //do not overwrite player spawn 395 | if(Mathf.within(x, y, spawn.x, spawn.y, 18f)){ 396 | continue; 397 | } 398 | 399 | float range = difficulty + rand.random(diffRange); 400 | 401 | Tile tile = tiles.getn(x, y); 402 | BasePart part = null; 403 | if(tile.overlay().itemDrop != null){ 404 | part = bases.forResource(tile.drop()).getFrac(range); 405 | }else if(tile.floor().liquidDrop != null && rand.chance(0.05)){ 406 | part = bases.forResource(tile.floor().liquidDrop).getFrac(range); 407 | }else if(rand.chance(0.05)){ //ore-less parts are less likely to occur. 408 | part = bases.parts.getFrac(range); 409 | } 410 | 411 | //actually place the part 412 | if(part != null && BaseGenerator.tryPlace(part, x, y, Team.derelict, (cx, cy) -> { 413 | Tile other = tiles.getn(cx, cy); 414 | if(other.floor().hasSurface()){ 415 | other.setOverlay(Blocks.oreScrap); 416 | for(int j = 1; j <= 2; j++){ 417 | for(Point2 p : Geometry.d8){ 418 | Tile t = tiles.get(cx + p.x*j, cy + p.y*j); 419 | if(t != null && t.floor().hasSurface() && rand.chance(j == 1 ? 0.4 : 0.2)){ 420 | t.setOverlay(Blocks.oreScrap); 421 | } 422 | } 423 | } 424 | } 425 | })){ 426 | placed ++; 427 | 428 | int debrisRadius = Math.max(part.schematic.width, part.schematic.height)/2 + 3; 429 | Geometry.circle(x, y, tiles.width, tiles.height, debrisRadius, (cx, cy) -> { 430 | float dst = Mathf.dst(cx, cy, x, y); 431 | float removeChance = Mathf.lerp(0.05f, 0.5f, dst / debrisRadius); 432 | 433 | Tile other = tiles.getn(cx, cy); 434 | if(other.build != null && other.isCenter()){ 435 | if(other.team() == Team.derelict && rand.chance(removeChance)){ 436 | other.remove(); 437 | }else if(rand.chance(0.5)){ 438 | other.build.health = other.build.health - rand.random(other.build.health * 0.9f); 439 | } 440 | } 441 | }); 442 | } 443 | } 444 | } 445 | 446 | //remove invalid ores 447 | for(Tile tile : tiles){ 448 | if(tile.overlay().needsSurface && !tile.floor().hasSurface()){ 449 | tile.setOverlay(Blocks.air); 450 | } 451 | } 452 | 453 | Schematics.placeLaunchLoadout(spawn.x, spawn.y); 454 | 455 | for(Room espawn : enemies){ 456 | tiles.getn(espawn.x, espawn.y).setOverlay(Blocks.spawn); 457 | } 458 | 459 | if(sector.hasEnemyBase()){ 460 | basegen.generate(tiles, enemies.map(r -> tiles.getn(r.x, r.y)), tiles.get(spawn.x, spawn.y), state.rules.waveTeam, sector, difficulty); 461 | 462 | state.rules.attackMode = sector.info.attack = true; 463 | }else{ 464 | state.rules.winWave = sector.info.winWave = 10 + 5 * (int)Math.max(difficulty * 10, 1); 465 | } 466 | 467 | float waveTimeDec = 0.4f; 468 | 469 | state.rules.waveSpacing = Mathf.lerp(60 * 65 * 2, 60f * 60f * 1f, Math.max(difficulty - waveTimeDec, 0f)); 470 | state.rules.waves = sector.info.waves = true; 471 | state.rules.enemyCoreBuildRadius = 600f; 472 | 473 | //spawn air only when spawn is blocked 474 | state.rules.spawns = Waves.generate(difficulty, new Rand(sector.id), state.rules.attackMode, state.rules.attackMode && spawner.countGroundSpawns() == 0, naval); 475 | } 476 | 477 | 478 | @Override 479 | public void generateSector(Sector sector) { 480 | super.generateSector(sector); 481 | } 482 | } 483 | -------------------------------------------------------------------------------- /src/heav/type/ShieldStatusEffect.java: -------------------------------------------------------------------------------- 1 | package heav.type; 2 | 3 | import mindustry.gen.*; 4 | import mindustry.type.*; 5 | import mindustry.world.meta.*; 6 | import heav.world.meta.*; 7 | 8 | public class ShieldStatusEffect extends StatusEffect{ 9 | public float shieldAmount = 20f; 10 | public float maxShield = 250f; 11 | public boolean remove = false; 12 | 13 | public ShieldStatusEffect(String name){ 14 | super(name); 15 | } 16 | 17 | @Override 18 | public void setStats(){ 19 | super.setStats(); 20 | stats.add(Stat.shieldHealth, HMStatValues.shieldListVal(this)); 21 | } 22 | 23 | @Override 24 | public boolean isHidden(){ 25 | return false; 26 | } 27 | 28 | @Override 29 | public void update(Unit unit, float time){ 30 | super.update(unit, time); 31 | if(unit.shield < maxShield){ 32 | if(!remove){ 33 | unit.shield = Math.min(unit.shield + (shieldAmount / 60), maxShield); 34 | }else{ 35 | unit.shield = Math.max(unit.shield - (shieldAmount / 60), 0); 36 | } 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/heav/util/HMDraw.java: -------------------------------------------------------------------------------- 1 | package heav.util; 2 | 3 | import arc.graphics.*; 4 | import arc.graphics.g2d.*; 5 | import arc.math.*; 6 | import mindustry.graphics.*; 7 | 8 | import static arc.graphics.g2d.Draw.*; 9 | import static arc.graphics.g2d.Lines.*; 10 | import static arc.math.Angles.*; 11 | public class HMDraw { 12 | public static void spike(float x,float y, Color color, float size, float rotation) { 13 | color(color); 14 | spike(x, y, 4, size, 2f, rotation); 15 | color(); 16 | } 17 | public static void spike(float x,float y, Color colorFrom, Color colorTo, float inOut, float size, float rotation) { 18 | color(colorFrom, colorTo, inOut); 19 | spike(x, y, 4, size, 2f, rotation); 20 | color(); 21 | } 22 | public static void spike(float x, float y, int spikes, float size, float lengthMultiplier, float rotation){ 23 | float step = 360f / spikes; 24 | for(int i = 0; i < spikes; i++){ 25 | Drawf.tri(x, y, size, (size * lengthMultiplier), i * step + rotation); 26 | }; 27 | } 28 | public static void splashLine(float x, float y, Color colorFrom, Color colorTo, float inOut, float thickness, float length, long id, int amount, float distance, float rotation, float cone){ 29 | color(colorFrom, colorTo, inOut); 30 | splashLine(x, y, thickness, length, id, amount, distance, rotation, cone); 31 | } 32 | public static void splashLine(float x, float y, Color color, float thickness, float length, long id, int amount, float distance, float rotation, float cone){ 33 | color(color); 34 | splashLine(x, y, thickness, length, id, amount, distance, rotation, cone); 35 | } 36 | public static void splashLine(float x, float y, float thickness, float length, long id, int amount, float distance, float rotation, float cone){ 37 | randLenVectors(id, amount, distance, rotation, cone, (a, b) -> { 38 | float ang = Mathf.angle(a, b); 39 | stroke(thickness); 40 | lineAngle(x + a, y + b, ang, length); 41 | stroke(1); 42 | }); 43 | } 44 | public static void lineCircle(float x, float y, Color color, float thickness, float radius){ 45 | color(color); 46 | lineCircle(x, y, thickness, radius); 47 | } 48 | public static void lineCircle(float x, float y, Color colorFrom, Color colorTo, float inOut,float thickness, float radius){ 49 | color(colorFrom, colorTo, inOut); 50 | lineCircle(x, y, thickness, radius); 51 | } 52 | public static void lineCircle(float x, float y, float thickness, float radius){ 53 | Lines.stroke(thickness); 54 | Lines.circle(x, y, radius); 55 | Lines.stroke(1); 56 | } 57 | public static void splashCircle(float x, float y, float radius, Color colorFrom, Color colorTo, float inOut, long id, int amount, float distance, float rotation, float cone){ 58 | color(colorFrom, colorTo, inOut); 59 | splashCircle(x, y, radius, id, amount, distance, rotation, cone); 60 | } 61 | public static void splashCircle(float x, float y, float radius, Color color, long id, int amount, float distance, float rotation, float cone){ 62 | color(color); 63 | splashCircle(x, y, radius, id, amount, distance, rotation, cone); 64 | } 65 | public static void splashCircle(float x, float y, float radius, long id, int amount, float distance, float rotation, float cone){ 66 | randLenVectors(id, amount, distance, rotation, cone, (a, b) -> { 67 | Fill.circle(x + a, y + b, radius); 68 | }); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/heav/util/HMFunc.java: -------------------------------------------------------------------------------- 1 | package heav.util; 2 | 3 | import arc.math.*; 4 | import arc.func.*; 5 | import arc.math.geom.*; 6 | import mindustry.game.*; 7 | import mindustry.entities.*; 8 | import mindustry.content.*; 9 | import mindustry.gen.*; 10 | 11 | public class HMFunc{ 12 | public static void radiusEnemies(Team team, float x, float y, float radius, Cons cons){ 13 | Units.nearbyEnemies(team, x - radius, y - radius, radius * 2f, radius * 2f, unit -> { 14 | if(unit.within(x, y, radius + unit.hitSize / 2f)){ 15 | cons.get(unit); 16 | }; 17 | }); 18 | }; 19 | public static void checkEffect(float range, Position pos, boolean condition, boolean aura, Effect effect, float amount){ 20 | if(condition){ 21 | if(aura){ 22 | for(int i = 0; i < amount; i++){ 23 | if(effect != Fx.none){ 24 | effect.at(pos.getX() + Angles.trnsx(Mathf.random(360), Mathf.random(range)), pos.getY() + Angles.trnsy(Mathf.random(360), Mathf.random(range))); 25 | }; 26 | }; 27 | }else{ 28 | if(effect != Fx.none){ 29 | effect.at(pos.getX(), pos.getY()); 30 | }; 31 | }; 32 | }; 33 | }; 34 | }; 35 | -------------------------------------------------------------------------------- /src/heav/world/blocks/defense/DRWall.java: -------------------------------------------------------------------------------- 1 | package heav.world.blocks.defense; 2 | 3 | import arc.graphics.*; 4 | import arc.math.*; 5 | import mindustry.gen.*; 6 | import mindustry.graphics.*; 7 | import mindustry.world.blocks.defense.*; 8 | import heav.content.*; 9 | 10 | public class DRWall extends Wall{ 11 | public float dRChance = 10f; 12 | public float dRPercentage = 30f; 13 | public Color hitColor = Pal.lancerLaser; 14 | 15 | public DRWall(String name){ 16 | super(name); 17 | }; 18 | 19 | public class DRWallBuild extends WallBuild{ 20 | 21 | @Override 22 | public boolean collision(Bullet bullet){ 23 | if(dRPercentage > 0 && dRChance > 0){ 24 | HMFx.blockSplash.at(x, y, size, hitColor); 25 | }; 26 | 27 | return super.collision(bullet); 28 | } 29 | 30 | @Override 31 | public float handleDamage(float amount){ 32 | float a = amount; 33 | if(Mathf.chance(dRChance)){ 34 | a = amount - (amount * (dRPercentage / 100)); 35 | }; 36 | return a; 37 | }; 38 | }; 39 | }; 40 | -------------------------------------------------------------------------------- /src/heav/world/blocks/defense/StatusEffectProjector.java: -------------------------------------------------------------------------------- 1 | package heav.world.blocks.defense; 2 | 3 | import arc.graphics.*; 4 | import arc.graphics.g2d.*; 5 | import arc.math.*; 6 | import arc.util.*; 7 | import mindustry.content.*; 8 | import mindustry.type.*; 9 | import mindustry.entities.*; 10 | import mindustry.gen.*; 11 | import mindustry.graphics.*; 12 | import mindustry.logic.*; 13 | import mindustry.world.*; 14 | import mindustry.world.meta.*; 15 | import heav.util.*; 16 | 17 | import static mindustry.Vars.*; 18 | 19 | public class StatusEffectProjector extends Block{ 20 | 21 | public Color starColor = Pal.lightPyraFlame; 22 | public float reloadTime = 60f * 3.5f; 23 | public float range = 160f; 24 | public float healPercent = 5f; 25 | public float damage = 20f; 26 | public StatusEffect allyStatus = StatusEffects.none; 27 | public StatusEffect enemiesStatus = StatusEffects.burning; 28 | public Effect statusFxAlly = Fx.none; 29 | public Effect statusFxEnemies = Fx.none; 30 | public Effect healEffect = Fx.none; 31 | public boolean enableAFxAura = false; 32 | public boolean enableEFxAura = true; 33 | public boolean enableHealing = true; 34 | 35 | public StatusEffectProjector(String name){ 36 | super(name); 37 | solid = true; 38 | update = true; 39 | group = BlockGroup.projectors; 40 | hasPower = true; 41 | }; 42 | 43 | @Override 44 | public void drawPlace(int x, int y, int rotation, boolean valid){ 45 | super.drawPlace(x, y, rotation, valid); 46 | Drawf.dashCircle(x * tilesize, y * tilesize, range, Pal.accent); 47 | }; 48 | 49 | @Override 50 | public void setStats(){ 51 | super.setStats(); 52 | stats.add(Stat.range, range); 53 | stats.add(Stat.reload, reloadTime / 60f, StatUnit.perSecond); 54 | }; 55 | 56 | public class StatusEffectProjectorBuild extends Building implements Ranged{ 57 | protected float eTime = 0f; 58 | protected float aTime = 0f; 59 | protected boolean wasHealed, appliedEnemies, appliedAlly = false; 60 | 61 | @Override 62 | public float range(){ 63 | return range; 64 | } 65 | 66 | @Override 67 | public void updateTile(){ 68 | if(consumeTriggerValid()){ 69 | eTime = Math.min(eTime + edelta(), reloadTime * 0.25f); 70 | aTime = Math.min(aTime + edelta(), reloadTime); 71 | if(aTime >= reloadTime){ 72 | wasHealed = false; 73 | appliedAlly = false; 74 | 75 | Units.nearby(team, x, y, range(), a -> { 76 | if(enableHealing){ 77 | if(a.damaged()){ 78 | a.heal(healPercent); 79 | Fx.heal.at(a); 80 | wasHealed = true; 81 | }; 82 | }; 83 | if(allyStatus != StatusEffects.none) { 84 | if(enableAFxAura){ 85 | if(statusFxAlly != Fx.none){ 86 | statusFxAlly.at(a); 87 | }; 88 | }; 89 | a.apply(allyStatus, 60f); 90 | appliedAlly = true; 91 | }; 92 | }); 93 | aTime = 0f; 94 | 95 | if(wasHealed){ 96 | if(healEffect != Fx.none){ 97 | healEffect.at(x, y, range, Pal.heal); 98 | }; 99 | }; 100 | } 101 | if(eTime >= reloadTime * 0.25f){ 102 | appliedEnemies = false; 103 | 104 | HMFunc.radiusEnemies(team, x, y, range(), e -> { 105 | e.apply(enemiesStatus, 60f); 106 | if(statusFxEnemies != Fx.none){ 107 | if(enableEFxAura){ 108 | statusFxEnemies.at(e); 109 | }; 110 | }; 111 | e.damage(damage); 112 | appliedEnemies = true; 113 | }); 114 | eTime = 0f; 115 | }; 116 | 117 | HMFunc.checkEffect(range(), this, appliedEnemies, enableEFxAura, statusFxEnemies, 5f); 118 | HMFunc.checkEffect(range(), this, appliedAlly, enableAFxAura, statusFxAlly, 5f); 119 | }; 120 | }; 121 | 122 | @Override 123 | public void draw(){ 124 | super.draw(); 125 | if(consumeTriggerValid()){ 126 | Draw.z(Layer.effect - 0.01f); 127 | HMDraw.spike(x, y, starColor, 2f * 2.9f + Mathf.absin(Time.time, 5f, 1f) + Mathf.random(0.1f), 2f * Time.time); 128 | HMDraw.spike(x, y, Color.white, 2f * 1.9f + Mathf.absin(Time.time, 5f, 1f) + Mathf.random(0.1f), 2f * Time.time); 129 | }; 130 | } 131 | 132 | @Override 133 | public void drawSelect(){ 134 | Drawf.dashCircle(x, y, range(), Pal.accent); 135 | } 136 | } 137 | } 138 | -------------------------------------------------------------------------------- /src/heav/world/blocks/defense/Tesla.java: -------------------------------------------------------------------------------- 1 | package heav.world.blocks.defense; 2 | 3 | import arc.graphics.*; 4 | import arc.graphics.g2d.*; 5 | import arc.math.*; 6 | import arc.util.*; 7 | import mindustry.content.*; 8 | import mindustry.entities.*; 9 | import mindustry.gen.*; 10 | import mindustry.graphics.*; 11 | import mindustry.logic.*; 12 | import mindustry.world.*; 13 | import mindustry.world.meta.*; 14 | import heav.util.*; 15 | import heav.content.*; 16 | 17 | 18 | import static mindustry.Vars.*; 19 | import heav.content.HMFx.LightningData; 20 | 21 | public class Tesla extends Block{ 22 | public float range = tilesize * 20f; 23 | public float reloadTime = 40f; 24 | public float damage = 20f; 25 | public int lightningCount = 3; 26 | public int lightningLength = 10; 27 | public int lightningLengthRand = 16; 28 | public Color lightningColor = Pal.lancerLaser; 29 | public Effect hitEffect = Fx.none; 30 | 31 | public Tesla(String name){ 32 | super(name); 33 | solid = true; 34 | update = true; 35 | group = BlockGroup.projectors; 36 | hasPower = true; 37 | } 38 | 39 | @Override 40 | public void drawPlace(int x, int y, int rotation, boolean valid){ 41 | super.drawPlace(x, y, rotation, valid); 42 | Drawf.dashCircle(x * tilesize, y * tilesize, range, lightningColor); 43 | }; 44 | 45 | @Override 46 | public void setStats(){ 47 | super.setStats(); 48 | stats.add(Stat.range, range); 49 | stats.add(Stat.reload, reloadTime / 60f, StatUnit.perSecond); 50 | }; 51 | 52 | public class TeslaBuild extends Building implements Ranged{ 53 | protected float rTime = 0f; 54 | 55 | @Override 56 | public float range(){ 57 | return range; 58 | } 59 | 60 | @Override 61 | public void updateTile(){ 62 | if(consumeTriggerValid()){ 63 | rTime = Math.min(rTime + edelta(), reloadTime); 64 | if(rTime >= reloadTime){ 65 | HMFunc.radiusEnemies(team, x, y, range(), u -> { 66 | u.damage(damage); 67 | float ang = Angles.angle(x, y, u.x, u.y); 68 | if(hitEffect != Fx.none) hitEffect.at(u, ang); 69 | 70 | HMFx.fakeLightning.at(x, y, ang, lightningColor, new LightningData(u, 4f)); 71 | if(Mathf.chance(25f)){ 72 | for(int i = 0; i < lightningCount; i++){ 73 | Lightning.create(team, lightningColor, damage * 0.5f, x, y, Mathf.random(0f, 359f), Mathf.random(lightningLength, lightningLengthRand)); 74 | } 75 | } 76 | }); 77 | rTime = 0f; 78 | } 79 | } 80 | } 81 | 82 | @Override 83 | public void draw(){ 84 | super.draw(); 85 | if(consumeTriggerValid()){ 86 | Draw.z(Layer.bullet + 0.01f); 87 | Draw.color(lightningColor); 88 | Fill.circle(x, y, 2f * 1.9f + Mathf.absin(Time.time, 5f, 1f) + Mathf.random(0.1f)); 89 | } 90 | } 91 | 92 | @Override 93 | public void drawSelect(){ 94 | Drawf.dashCircle(x, y, range(), lightningColor); 95 | } 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /src/heav/world/blocks/defense/turrets/DisabledPredictTurret.java: -------------------------------------------------------------------------------- 1 | package heav.world.blocks.defense.turrets; 2 | 3 | import mindustry.gen.*; 4 | import mindustry.world.blocks.defense.turrets.*; 5 | 6 | public class DisabledPredictTurret extends PowerTurret{ 7 | 8 | public DisabledPredictTurret(String name){ 9 | super(name); 10 | } 11 | 12 | public class DisabledPredictTurretBuild extends PowerTurretBuild{ 13 | 14 | @Override 15 | public void targetPosition(Posc pos){ 16 | if(!hasAmmo() || pos == null) return; 17 | 18 | targetPos.set(pos); 19 | if(targetPos.isZero()){ 20 | targetPos.set(pos); 21 | } 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/heav/world/blocks/defense/turrets/FractalTurret.java: -------------------------------------------------------------------------------- 1 | package heav.world.blocks.defense.turrets; 2 | 3 | import arc.util.*; 4 | import arc.math.*; 5 | import arc.math.geom.*; 6 | import mindustry.entities.bullet.*; 7 | 8 | public class FractalTurret extends DisabledPredictTurret{ 9 | 10 | public FractalTurret(String name){ 11 | super(name); 12 | } 13 | 14 | public class FractalTurretBuild extends DisabledPredictTurretBuild{ 15 | 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/heav/world/meta/HMStatValues.java: -------------------------------------------------------------------------------- 1 | package heav.world.meta; 2 | 3 | import arc.*; 4 | import arc.scene.ui.layout.*; 5 | import mindustry.world.meta.*; 6 | import heav.type.*; 7 | 8 | public class HMStatValues { 9 | public static StatValue shieldListVal(ShieldStatusEffect status){ 10 | return table -> { 11 | table.row(); 12 | table.table(s -> { 13 | s.left().defaults().padRight(3).left(); 14 | sepC(status.maxShield > 0, s, "[lightgray]" + Core.bundle.get("status.maxShield") + ":[] " + status.maxShield); 15 | sepC(!status.remove, s, "[lightgray]" + Core.bundle.get("status.shieldAmount") + ":[] " + status.shieldAmount + " " + StatUnit.perSecond.localized()); 16 | sepC(status.remove, s, "[lightgray]" + Core.bundle.get("status.shieldRemoved") + ":[] " + status.shieldAmount + " " + StatUnit.perSecond.localized()); 17 | }); 18 | }; 19 | } 20 | private static void sepC(boolean condition, Table table, String text){ 21 | if(condition){ 22 | table.row(); 23 | table.add(text); 24 | }; 25 | } 26 | } 27 | --------------------------------------------------------------------------------