diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index cf3bd34e0e..50fa001df5 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -1,12 +1,25 @@
---
name: Bug report
about: Create a report to help fix an issue.
+title: ''
+labels: bug
+assignees: ''
+
---
-**Platform**: (Android/iOS/Mac/Windows/Linux)
+**Platform**: *Android/iOS/Mac/Windows/Linux*
-**Build**: (The build number under the title in the main menu. Required.)
+**Build**: *The build number under the title in the main menu. Required.*
-**Issue**: (Explain your issue in detail.)
+**Issue**: *Explain your issue in detail.*
-**Steps to reproduce**: (How you happened across the issue, and what you were doing at the time.)
+**Steps to reproduce**: *How you happened across the issue, and what you were doing at the time.*
+
+**Link to mod(s) used, if applicable**: *The mod repositories or zip files that are related to the issue.*
+
+**Crash report, if applicable**: *The contents of relevant crash report files.*
+
+---
+
+*Place an X (no spaces) between the brackets to confirm that you have read the line below.*
+- [ ] **I have searched the closed and open issues to make sure that this problem has not already been reported.**
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 0000000000..e1d9fecf05
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,8 @@
+blank_issues_enabled: false
+contact_links:
+ - name: Feature request
+ url: https://github.com/Anuken/Mindustry-Suggestions/issues/new/choose
+ about: Do not make a new issue for feature requests! Instead, post it in suggestions repository.
+ - name: Question
+ url: https://discord.com/invite/mindustry
+ about: Questions about the game should be asked in the Discord, not in the issue tracker.
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
deleted file mode 100644
index 335d17f26a..0000000000
--- a/.github/ISSUE_TEMPLATE/feature_request.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-name: Feature request
-about: Suggest an idea for this project
-
----
-
-**Do not make a new issue for feature requests!** Instead, post it in #545.
diff --git a/.github/Mindustry-CodeStyle-IJ.xml b/.github/Mindustry-CodeStyle-IJ.xml
new file mode 100644
index 0000000000..e63661b6d3
--- /dev/null
+++ b/.github/Mindustry-CodeStyle-IJ.xml
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml
index b23caac61e..c2326a4d0a 100644
--- a/.github/workflows/gradle.yml
+++ b/.github/workflows/gradle.yml
@@ -3,15 +3,26 @@ name: Java CI
on: [push]
jobs:
- build:
-
+ buildJava8:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- - name: Set up JDK 1.8
+ - name: Set up JDK 8
uses: actions/setup-java@v1
with:
- java-version: 1.8
- - name: Run unit tests with gradle
+ java-version: 8
+ - name: Run unit tests with gradle and Java 8
+ run: ./gradlew test
+
+ buildJava14:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v1
+ - name: Set up JDK 14
+ uses: actions/setup-java@v1
+ with:
+ java-version: 14
+ - name: Run unit tests with gradle and Java 14
run: ./gradlew test
diff --git a/.gitignore b/.gitignore
index 8e8a4c2689..1a50ef27f2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,6 +10,7 @@ logs/
/desktop/mindustry-saves/
/desktop/mindustry-maps/
/desktop/gifexport/
+/gifs/
/core/lib/
/ios/assets/
/core/assets-raw/sprites/generated/
@@ -18,29 +19,30 @@ logs/
/annotations/out/
/net/build/
/tools/build/
+/core/build/
/tests/build/
/server/build/
changelog
saves/
+/core/assets-raw/fontgen/out/
core/assets/saves/
/core/assets/saves/
steam_appid.txt
/test_files/
-/annotations/build/
/android/assets/mindustry-maps/
/android/assets/mindustry-saves/
/core/assets/gifexport/
+/annotations/src/main/resources/META-INF/services
/core/assets/version.properties
/core/assets/locales
-/ios/src/io/anuke/mindustry/gen/
-/core/src/io/anuke/mindustry/gen/
+/ios/src/mindustry/gen/
+/core/src/mindustry/gen/
ios/robovm.properties
packr-out/
config/
-changelog
*.gif
-/core/assets/saves/
+/core/assets/basepartnames
version.properties
.attach_*
@@ -55,15 +57,6 @@ crash-report-*
## Robovm
/ios/robovm-build/
-## GWT
-/html/war/
-/html/gwt-unitCache/
-.apt_generated/
-.gwt/
-gwt-unitCache/
-www-test/
-.gwt-tmp/
-
## Android Studio and Intellij and Android in general
/android/libs/armeabi/
/android/libs/armeabi-v7a/
diff --git a/.travis.yml b/.travis.yml
index 9df31f3301..ef04618dc9 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,16 +1,16 @@
jdk:
- openjdk8
-dist: trusty
+dist: xenial
android:
components:
- android-29
- - build-tools-29.0.2
+ - build-tools-29.0.3
script:
- git clone --depth=1 --branch=master https://github.com/Anuken/MindustryBuilds ../MindustryBuilds
- cd ../MindustryBuilds
- echo ${TRAVIS_TAG}
-- if [ -n "$TRAVIS_TAG" ]; then echo versionName=4-fdroid-${TRAVIS_TAG:1}$'\n'versionCode=${TRAVIS_TAG:1} > version_fdroid.txt; git add .; git commit -m "Updating to build ${TRAVIS_TAG}"; fi
+- if [ -n "$TRAVIS_TAG" ]; then echo versionName=5-fdroid-${TRAVIS_TAG:1}$'\n'versionCode=${TRAVIS_TAG:1} > version_fdroid.txt; git add .; git commit -m "Updating to build ${TRAVIS_TAG}"; fi
- git tag ${TRAVIS_BUILD_NUMBER}
- git config --global user.name "Build Uploader"
- if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then git push https://Anuken:${GH_PUSH_TOKEN}@github.com/Anuken/MindustryBuilds ${TRAVIS_BUILD_NUMBER}; git push https://Anuken:${GH_PUSH_TOKEN}@github.com/Anuken/MindustryBuilds; fi
@@ -20,6 +20,12 @@ script:
- "./gradlew test"
- "./gradlew desktop:dist -Pbuildversion=${TRAVIS_TAG:1}"
- "./gradlew server:dist -Pbuildversion=${TRAVIS_TAG:1}"
+- "./gradlew core:javadoc"
+- cd ../
+- git clone --depth=1 https://github.com/MindustryGame/docs.git
+- cp -a Mindustry/core/build/docs/javadoc/. docs/
+- cd docs
+- if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then git add .; git commit -m "Update ${TRAVIS_BUILD_NUMBER}"; git push https://Anuken:${GH_PUSH_TOKEN}@github.com/MindustryGame/docs; fi
deploy:
- provider: releases
skip_cleanup: true
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000000..fe38a3a925
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,70 @@
+# Contributing
+
+This is for code contributions. For translations, see [TRANSLATING](TRANSLATING.md).
+
+## Basic Guidelines
+
+#### Use an IDE.
+Specifically, IntelliJ IDEA. Download the (free) Community Edition of it [here](https://www.jetbrains.com/idea/download/). Some people use other tools, like VS Code, but I would personally not recommend them for Java development.
+
+#### Always test your changes.
+Do not submit something without at least running the game to see if it compiles.
+If you are submitting a new block, make sure it has a name and description, and that it works correctly in-game. If you are changing existing block mechanics, test them out first.
+
+
+#### Do not make large changes before discussing them first.
+If you are interested in adding a large mechanic/feature or changing large amounts of code, first contact me (Anuken) via [Discord](https://discord.gg/mindustry) (preferred method) or via e-mail (*anukendev@gmail.com*).
+For most changes, this should not be necessary. I just want to know if you're doing something big so I can offer advice and/or make sure you're not wasting your time on it.
+
+
+## Style Guidelines
+
+#### Follow the formatting guidelines.
+This means:
+- No spaces around parentheses: `if(condition){`, `SomeType s = (SomeType)object`
+- Same-line braces.
+- 4 spaces indentation
+- `camelCase`, **even for constants or enums**. Why? Because `SCREAMING_CASE` is ugly, annoying to type and does not achieve anything useful. Constants are *less* dangerous than variables, not more.
+- No underscores for anything. (Yes, I know `Bindings` violates this principle, but that's for legacy reasons and really should be cleaned up some day)
+- Do not use braceless `if/else` statements. `if(x) statement else statement2` should **never** be done. In very specific situations, having braceless if-statements on one line is allowed: `if(cond) return;` would be valid.
+
+Import [this style file](.github/Mindustry-CodeStyle-IJ.xml) into IntelliJ to get correct formatting when developing Mindustry.
+
+#### Do not use incompatible Java features (java.util.function, java.awt).
+Android and RoboVM (iOS) do not support many of Java 8's features, such as the packages `java.util.function`, `java.util.stream` or `forEach` in collections. Do not use these in your code.
+If you need to use functional interfaces, use the ones in `arc.func`, which are more or less the same with different naming schemes.
+
+The same applies to any class *outside* of the standard `java.[n]io` / `java.net` / `java.util` packages: Most of them are not supported.
+`java.awt` is one of these packages: do not use it, ever. It is not supported on any platform, even desktop - the entire package is removed during JRE minimization.
+In general, if you are using IntelliJ, you should be warned about platform incompatiblities.
+
+
+#### Use `arc` collections and classes when possible.
+Instead of using `java.util.List`, `java.util.HashMap`, and other standard Java collections, use `Seq`, `ObjectMap` and other equivalents from `arc.struct`.
+Why? Because that's what the rest of the codebase uses, and the standard collections have a lot of cruft and usability issues associated with them.
+In the rare case that concurrency is required, you may use the standard Java classes for that purpose (e.g. `CopyOnWriteArrayList`).
+
+What you'll usually need to change:
+- `HashSet` -> `ObjectSet`
+- `HashMap` -> `ObjectMap`
+- `List` / `ArrayList` / `Stack` -> `Seq`
+- `java.util.Queue` -> `arc.struct.Queue`
+- *Many others*
+
+
+#### Avoid boxed types (Integer, Boolean)
+Never create variables or collections with boxed types `Seq` or `ObjectMap`. Use the collections specialized for this task, e.g. `IntSeq` and `IntMap`.
+
+
+#### Do not allocate anything if possible.
+Never allocate `new` objects in the main loop. If you absolutely require new objects, use `Pools` to obtain and free object instances.
+Otherwise, use the `Tmp` variables for things like vector/shape operations, or create `static` variables for re-use.
+If using a list, make it a static variable and clear it every time it is used. Re-use as much as possible.
+
+#### Avoid bloated code and unnecessary getters/setters.
+This is situational, but in essence what it means is to avoid using any sort of getters and setters unless absolutely necessary. Public or protected fields should suffice for most things.
+If something needs to be encapsulated in the future, IntelliJ can handle it with a few clicks.
+
+
+#### Do not create methods unless necessary.
+Unless a block of code is very large or used in more than 1-2 places, don't split it up into a separate method. Making unnecessary methods only creates confusion, and may slightly decrease performance.
diff --git a/README.md b/README.md
index 4dce34be64..7f0e6208bc 100644
--- a/README.md
+++ b/README.md
@@ -1,29 +1,36 @@
-
+
[](https://travis-ci.org/Anuken/Mindustry)
-[](https://discord.gg/mindustry)
+[](https://discord.gg/mindustry)
A sandbox tower defense game written in Java.
_[Trello Board](https://trello.com/b/aE2tcUwF/mindustry-40-plans)_
-_[Wiki](https://mindustrygame.github.io/wiki)_
+_[Wiki](https://mindustrygame.github.io/wiki)_
+_[Javadoc](https://mindustrygame.github.io/docs/)_
+
+### Contributing
+
+See [CONTRIBUTING](CONTRIBUTING.md).
### Building
Bleeding-edge live builds are generated automatically for every commit. You can see them [here](https://github.com/Anuken/MindustryBuilds/releases). Old builds might still be on [jenkins](https://jenkins.hellomouse.net/job/mindustry/).
If you'd rather compile on your own, follow these instructions.
-First, make sure you have [Java 8](https://www.java.com/en/download/) and [JDK 8](https://adoptopenjdk.net/) installed. Open a terminal in the root directory, `cd` to the Mindustry folder and run the following commands:
+First, make sure you have [JDK 14](https://adoptopenjdk.net/) installed. Open a terminal in the root directory, `cd` to the Mindustry folder and run the following commands:
#### Windows
-_Running:_ `gradlew desktop:run`
-_Building:_ `gradlew desktop:dist`
+_Running:_ `gradlew.bat desktop:run`
+_Building:_ `gradlew.bat desktop:dist`
+_Sprite Packing:_ `gradlew.bat tools:pack`
#### Linux/Mac OS
_Running:_ `./gradlew desktop:run`
-_Building:_ `./gradlew desktop:dist`
+_Building:_ `./gradlew desktop:dist`
+_Sprite Packing:_ `./gradlew tools:pack`
#### Server
@@ -34,7 +41,7 @@ Server builds are bundled with each released build (in Releases). If you'd rathe
1. Install the Android SDK [here.](https://developer.android.com/studio#downloads) Make sure you're downloading the "Command line tools only", as Android Studio is not required.
2. Create a file named `local.properties` inside the Mindustry directory, with its contents looking like this: `sdk.dir=`. For example, if you're on Windows and installed the tools to C:\\tools, your local.properties would contain `sdk.dir=C:\\tools` (*note the double backslashes are required instead of single ones!*).
3. Run `gradlew android:assembleDebug` (or `./gradlew` if on linux/mac). This will create an unsigned APK in `android/build/outputs/apk`.
-4. (Optional) To debug the application on a connected phone, do `gradlew android:installDebug android:run`. It is **highly recommended** to use IntelliJ for this instead, however.
+4. (Optional) To debug the application on a connected phone, do `gradlew android:installDebug android:run`. It is **highly recommended** to use IntelliJ for this instead.
##### Troubleshooting
@@ -45,6 +52,10 @@ If the terminal returns `Permission denied` or `Command not found` on Mac/Linux,
Gradle may take up to several minutes to download files. Be patient.
After building, the output .JAR file should be in `/desktop/build/libs/Mindustry.jar` for desktop builds, and in `/server/build/libs/server-release.jar` for server builds.
+### Feature Requests
+
+Post feature requests and feedback [here](https://github.com/Anuken/Mindustry-Suggestions/issues/new/choose).
+
### Downloads
[`. "Appropriate" means that:
+ - Your name or description must reflect the type of server you're hosting.
+ Since new players may be exposed to the server list early on, put in a phrase like "Co-op survival" or "PvP" so players know what they're getting into. Yes, this is also displayed in the server mode info text, but having extra info in the name doesn't hurt.
+ - Make sure players know where to refer to for server support. It should be fairly clear that the server owner is not me, but you.
+ - Try to be professional in your text; use common sense.
+3. **Get some good maps.** *(optional, but highly recommended)*. Add some maps to your server and set the map rotation to custom-only. You can get maps from the Steam workshop by subscribing and exporting them; using the `#maps` channel on Discord is also an option.
+4. **Check your server configuration.** *(optional)* I would recommend adding a message rate limit of 1 second (`config messageRateLimit 1`), and disabling connect/disconnect messages to reduce spam (`config showConnectMessages false`).
+5. Finally, **submit a pull request** to add your server's IP to the list.
+This should be fairly straightforward: Press the edit button on the [server file](https://github.com/Anuken/Mindustry/blob/master/servers.json), then add a JSON object with a single key, indicating your server address.
+For example, if your server address is `google.com`, you would add a comma after the last entry and insert:
+```json
+ {
+ "address": "google.com"
+ }
+```
+Then, press the *'submit pull request'* button and I'll take a look at your server. If I have any issues with it, I'll let you know in the PR comments.
diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml
index a4202d4364..7d4d731df1 100644
--- a/android/AndroidManifest.xml
+++ b/android/AndroidManifest.xml
@@ -3,6 +3,7 @@
package="io.anuke.mindustry">
+
@@ -13,12 +14,13 @@
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round"
android:isGame="true"
+ android:usesCleartextTraffic="true"
android:appCategory="game"
android:label="@string/app_name"
- android:theme="@style/GdxTheme" android:fullBackupContent="@xml/backup_rules">
+ android:theme="@style/ArcTheme" android:fullBackupContent="@xml/backup_rules">
diff --git a/android/build.gradle b/android/build.gradle
index 8dfa8665c5..412ed1c441 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -8,6 +8,8 @@ buildscript{
}
dependencies{
+ //IMPORTANT NOTICE: any version of the plugin after 3.4.1 will break builds for every API level < 24, perhaps even higher.
+ //it appears abstract methods don't get desugared properly (if at all)
classpath 'com.android.tools.build:gradle:3.4.1'
}
}
@@ -19,25 +21,18 @@ configurations{ natives }
repositories{
mavenCentral()
jcenter()
- maven{
- url "https://maven.google.com"
- }
+ maven{ url "https://maven.google.com" }
}
dependencies{
implementation project(":core")
implementation arcModule("backends:backend-android")
- natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi"
- natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a"
- natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-arm64-v8a"
- natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86"
- natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86_64"
- natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi"
- natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi-v7a"
- natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-arm64-v8a"
- natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86"
- natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86_64"
+ implementation 'com.jakewharton.android.repackaged:dalvik-dx:9.0.0_r3'
+
+ natives "com.github.Anuken.Arc:natives-android:${getArcHash()}"
+ natives "com.github.Anuken.Arc:natives-freetype-android:${getArcHash()}"
+ natives "com.github.Anuken.Arc:natives-box2d-android:${getArcHash()}"
}
task deploy(type: Copy){
@@ -49,7 +44,7 @@ task deploy(type: Copy){
}
android{
- buildToolsVersion '29.0.2'
+ buildToolsVersion '29.0.3'
compileSdkVersion 29
sourceSets{
main{
@@ -69,7 +64,7 @@ android{
}
defaultConfig{
- Properties props = new Properties().with{p -> p.load(file('../core/assets/version.properties').newReader()); return p }
+ Properties props = loadVersionProps()
Integer vcode = props['androidBuildCode']?.toInteger() ?: 1
def versionNameResult = "$versionNumber-$versionType-${getBuildVersion().replace(" ", "-")}"
@@ -118,25 +113,11 @@ android{
// the natives configuration, and extracts them to the proper libs/ folders
// so they get packed with the APK.
task copyAndroidNatives(){
- file("libs/armeabi/").mkdirs()
- file("libs/armeabi-v7a/").mkdirs()
- file("libs/arm64-v8a/").mkdirs()
- file("libs/x86_64/").mkdirs()
- file("libs/x86/").mkdirs()
-
configurations.natives.files.each{ jar ->
- def outputDir = null
- if(jar.name.endsWith("natives-arm64-v8a.jar")) outputDir = file("libs/arm64-v8a")
- if(jar.name.endsWith("natives-armeabi-v7a.jar")) outputDir = file("libs/armeabi-v7a")
- if(jar.name.endsWith("natives-armeabi.jar")) outputDir = file("libs/armeabi")
- if(jar.name.endsWith("natives-x86_64.jar")) outputDir = file("libs/x86_64")
- if(jar.name.endsWith("natives-x86.jar")) outputDir = file("libs/x86")
- if(outputDir != null){
- copy{
- from zipTree(jar)
- into outputDir
- include "*.so"
- }
+ copy{
+ from zipTree(jar)
+ into file("libs/")
+ include "**"
}
}
}
@@ -160,5 +141,5 @@ task run(type: Exec){
}
def adb = path + "/platform-tools/adb"
- commandLine "$adb", 'shell', 'am', 'start', '-n', 'io.anuke.mindustry/io.anuke.mindustry.AndroidLauncher'
-}
\ No newline at end of file
+ commandLine "$adb", 'shell', 'am', 'start', '-n', 'io.anuke.mindustry/mindustry.android.AndroidLauncher'
+}
diff --git a/android/proguard-project.txt b/android/proguard-project.txt
deleted file mode 100644
index 1f34b8cae8..0000000000
--- a/android/proguard-project.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-# http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-# public *;
-#}
-
--verbose
--verbose
--ignorewarnings
--keep class io.anuke.mindustry.game.Rules
--keep class io.anuke.mindustry.desktop.DesktopLauncher
--keepclasseswithmembers public class * {
- public static void main(java.lang.String[]);
-}
diff --git a/android/project.properties b/android/project.properties
deleted file mode 100644
index f13bd4b19c..0000000000
--- a/android/project.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-# Project target.
-target=android-19
diff --git a/android/res/mipmap-anydpi-v26/ic_launcher.xml b/android/res/mipmap-anydpi-v26/ic_launcher.xml
index 4ae7d12378..cb73a95729 100644
--- a/android/res/mipmap-anydpi-v26/ic_launcher.xml
+++ b/android/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -2,4 +2,4 @@
-
\ No newline at end of file
+
diff --git a/android/res/mipmap-anydpi-v26/ic_launcher_round.xml b/android/res/mipmap-anydpi-v26/ic_launcher_round.xml
index 4ae7d12378..cb73a95729 100644
--- a/android/res/mipmap-anydpi-v26/ic_launcher_round.xml
+++ b/android/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -2,4 +2,4 @@
-
\ No newline at end of file
+
diff --git a/android/res/values-v21/styles.xml b/android/res/values-v21/styles.xml
index 699b6a05d7..3076a158ed 100644
--- a/android/res/values-v21/styles.xml
+++ b/android/res/values-v21/styles.xml
@@ -1,6 +1,6 @@
-
-
\ No newline at end of file
+
diff --git a/android/res/values/strings.xml b/android/res/values/strings.xml
index b77280e581..d40cf3accd 100644
--- a/android/res/values/strings.xml
+++ b/android/res/values/strings.xml
@@ -3,4 +3,4 @@
Mindustry
-
\ No newline at end of file
+
diff --git a/android/res/values/styles.xml b/android/res/values/styles.xml
index 5b8b96ea1e..3fe4d7f6a8 100644
--- a/android/res/values/styles.xml
+++ b/android/res/values/styles.xml
@@ -1,6 +1,6 @@
-