diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml
index 36ae017d35..91f3eb8269 100644
--- a/android/AndroidManifest.xml
+++ b/android/AndroidManifest.xml
@@ -1,10 +1,11 @@
+ android:versionCode="24"
+ android:versionName="3.08b" >
+
+
+
+
diff --git a/android/build.gradle b/android/build.gradle
index 413b869046..a2073df378 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -1,3 +1,17 @@
+
+repositories {
+ mavenCentral()
+ jcenter()
+ maven {
+ url "https://maven.google.com"
+ }
+}
+
+dependencies {
+ compile 'com.android.support:support-v4:22.1.1'
+ compile 'org.sufficientlysecure:donations:2.5'
+}
+
android {
buildToolsVersion "25.0.0"
compileSdkVersion 25
@@ -31,6 +45,12 @@ android {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
+
+ productFlavors {
+ google {
+ buildConfigField "boolean", "DONATIONS_GOOGLE", "true"
+ }
+ }
}
// called every time gradle gets executed, takes the native dependencies of
// the natives configuration, and extracts them to the proper libs/ folders
@@ -130,8 +150,4 @@ idea {
}
}
}
-}
-
-dependencies {
- //compile files('lib/ucore.jar')
}
\ No newline at end of file
diff --git a/android/res/layout/donations_activity.xml b/android/res/layout/donations_activity.xml
new file mode 100644
index 0000000000..1c71e7253e
--- /dev/null
+++ b/android/res/layout/donations_activity.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/res/values/strings.xml b/android/res/values/strings.xml
index d40cf3accd..482ac993cf 100644
--- a/android/res/values/strings.xml
+++ b/android/res/values/strings.xml
@@ -2,5 +2,13 @@
Mindustry
+
+ - 1 Dollar
+ - 2 Dollars
+ - 3 Dollars
+ - 5 Dollars
+ - 10 Dollars
+ - 15 Dollars
+
diff --git a/android/src/io/anuke/mindustry/AndroidLauncher.java b/android/src/io/anuke/mindustry/AndroidLauncher.java
index 6d87d0aef3..718805af04 100644
--- a/android/src/io/anuke/mindustry/AndroidLauncher.java
+++ b/android/src/io/anuke/mindustry/AndroidLauncher.java
@@ -8,6 +8,7 @@ import com.badlogic.gdx.backends.android.AndroidApplication;
import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration;
import android.annotation.SuppressLint;
+import android.content.Intent;
import android.os.Bundle;
import android.util.DisplayMetrics;
import io.anuke.mindustry.io.Formatter;
@@ -37,6 +38,8 @@ public class AndroidLauncher extends AndroidApplication{
return NumberFormat.getIntegerInstance().format(number);
}
};
+
+ Mindustry.donationsCallable = this::showDonations;
if(doubleScaleTablets){
DisplayMetrics metrics = new DisplayMetrics();
@@ -55,7 +58,14 @@ public class AndroidLauncher extends AndroidApplication{
}
//Mindustry.args.add("-debug");
-
+
+ config.hideStatusBar = true;
+
initialize(new Mindustry(), config);
}
+
+ void showDonations(){
+ Intent intent = new Intent(this, DonationsActivity.class);
+ startActivity(intent);
+ }
}
diff --git a/android/src/io/anuke/mindustry/DonationsActivity.java b/android/src/io/anuke/mindustry/DonationsActivity.java
new file mode 100644
index 0000000000..07d1b6c1b1
--- /dev/null
+++ b/android/src/io/anuke/mindustry/DonationsActivity.java
@@ -0,0 +1,62 @@
+package io.anuke.mindustry;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentTransaction;
+
+import com.badlogic.gdx.Gdx;
+import com.badlogic.gdx.backends.android.AndroidGraphics;
+
+import org.sufficientlysecure.donations.DonationsFragment;
+
+public class DonationsActivity extends FragmentActivity {
+
+ /**
+ * Google
+ */
+ private static final String GOOGLE_PUBKEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAg8bTVFK5zIg4FGYkHKKQ/j/iGZQlXU0qkAv2BA6epOX1ihbMz78iD4SmViJlECHN8bKMHxouRNd9pkmQKxwEBHg5/xDC/PHmSCXFx/gcY/xa4etA1CSfXjcsS9i94n+j0gGYUg69rNkp+p/09nO9sgfRTAQppTxtgKaXwpfKe1A8oqmDUfOnPzsEAG6ogQL6Svo6ynYLVKIvRPPhXkq+fp6sJ5YVT5Hr356yCXlM++G56Pk8Z+tPzNjjvGSSs/MsYtgFaqhPCsnKhb55xHkc8GJ9haq8k3PSqwMSeJHnGiDq5lzdmsjdmGkWdQq2jIhKlhMZMm5VQWn0T59+xjjIIwIDAQAB";
+ private static final String[] GOOGLE_CATALOG = new String[]{"ntpsync.donation.1",
+ "ntpsync.donation.2", "ntpsync.donation.3", "ntpsync.donation.5", "ntpsync.donation.8",
+ "ntpsync.donation.13"};
+
+ /**
+ * Called when the activity is first created.
+ */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ //TODO
+ setContentView(((AndroidGraphics)Gdx.graphics).getView());
+
+ FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
+ DonationsFragment donationsFragment;
+ if (BuildConfig.DONATIONS_GOOGLE) {
+ donationsFragment = DonationsFragment.newInstance(BuildConfig.DEBUG, true, GOOGLE_PUBKEY, GOOGLE_CATALOG,
+ getResources().getStringArray(R.array.donation_google_catalog_values), false, null, null,
+ null, false, null, null, false, null);
+ }
+
+ ft.replace(R.id.donations_activity_container, donationsFragment, "donationsFragment");
+ ft.commit();
+ }
+
+ /**
+ * Needed for Google Play In-app Billing. It uses startIntentSenderForResult(). The result is not propagated to
+ * the Fragment like in startActivityForResult(). Thus we need to propagate manually to our Fragment.
+ */
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+
+ FragmentManager fragmentManager = getSupportFragmentManager();
+ Fragment fragment = fragmentManager.findFragmentByTag("donationsFragment");
+ if (fragment != null) {
+ fragment.onActivityResult(requestCode, resultCode, data);
+ }
+ }
+
+}
diff --git a/build.gradle b/build.gradle
index 61901cb5b0..82190c74b5 100644
--- a/build.gradle
+++ b/build.gradle
@@ -79,7 +79,7 @@ project(":core") {
apply plugin: "java"
dependencies {
- compile 'com.github.Anuken:ucore:6238d06'
+ compile 'com.github.Anuken:ucore:a1ae9be'
compile "com.badlogicgames.gdx:gdx:$gdxVersion"
compile "com.badlogicgames.gdx:gdx-ai:1.8.1"
}
diff --git a/core/src/io/anuke/mindustry/Mindustry.java b/core/src/io/anuke/mindustry/Mindustry.java
index def6b2be5d..8b3f362030 100644
--- a/core/src/io/anuke/mindustry/Mindustry.java
+++ b/core/src/io/anuke/mindustry/Mindustry.java
@@ -13,23 +13,16 @@ import io.anuke.mindustry.world.World;
import io.anuke.mindustry.world.blocks.*;
import io.anuke.ucore.core.Inputs;
import io.anuke.ucore.core.Timers;
+import io.anuke.ucore.function.Callable;
import io.anuke.ucore.modules.ModuleCore;
import io.anuke.ucore.util.Profiler;
public class Mindustry extends ModuleCore {
+ public static Callable donationsCallable;
public static Array args = new Array<>();
public static Formatter formatter = new Formatter(){
-
- @Override
- public String format(Date date){
- return "invalid date";
- }
-
- @Override
- public String format(int number){
- return number + "";
- }
-
+ @Override public String format(Date date){ return "invalid date"; }
+ @Override public String format(int number){ return number + ""; }
};
//always initialize blocks in this order, otherwise there are ID errors
diff --git a/core/src/io/anuke/mindustry/core/Renderer.java b/core/src/io/anuke/mindustry/core/Renderer.java
index 70fafe0276..333a0ce0cd 100644
--- a/core/src/io/anuke/mindustry/core/Renderer.java
+++ b/core/src/io/anuke/mindustry/core/Renderer.java
@@ -180,11 +180,12 @@ public class Renderer extends RendererModule{
Graphics.shader();
Entities.draw(Entities.defaultGroup());
- Entities.draw(control.bulletGroup);
Profiler.end("entityDraw");
if(!optimize) drawBlocks(true, false);
+
+ Entities.draw(control.bulletGroup);
drawShield();
diff --git a/core/src/io/anuke/mindustry/entities/BulletType.java b/core/src/io/anuke/mindustry/entities/BulletType.java
index 9e6f2f46eb..caa9df31c6 100644
--- a/core/src/io/anuke/mindustry/entities/BulletType.java
+++ b/core/src/io/anuke/mindustry/entities/BulletType.java
@@ -62,7 +62,7 @@ public abstract class BulletType extends BaseBulletType{
}
}
},
- emp = new BulletType(1.6f, 8){
+ emp = new BulletType(1.6f, 6){
{
lifetime = 50f;
hitsize = 6f;
diff --git a/core/src/io/anuke/mindustry/entities/WaveCreator.java b/core/src/io/anuke/mindustry/entities/WaveCreator.java
index 22d4b72780..b4c32d801b 100644
--- a/core/src/io/anuke/mindustry/entities/WaveCreator.java
+++ b/core/src/io/anuke/mindustry/entities/WaveCreator.java
@@ -149,8 +149,8 @@ public class WaveCreator{
}},
new EnemySpawn(FortressEnemy.class){{
after = 12;
- spacing = 4;
- scaling = 6;
+ spacing = 5;
+ scaling = 7;
}},
new EnemySpawn(HealerEnemy.class){{
scaling = 3;
@@ -163,8 +163,8 @@ public class WaveCreator{
}},
new EnemySpawn(FlamerEnemy.class){{
after = 14;
- spacing = 5;
- scaling = 2;
+ spacing = 6;
+ scaling = 3;
}},
new EnemySpawn(BlastEnemy.class){{
after = 12;
diff --git a/core/src/io/anuke/mindustry/entities/effect/EMP.java b/core/src/io/anuke/mindustry/entities/effect/EMP.java
index 61eba1aabd..edbb9cda48 100644
--- a/core/src/io/anuke/mindustry/entities/effect/EMP.java
+++ b/core/src/io/anuke/mindustry/entities/effect/EMP.java
@@ -53,7 +53,7 @@ public class EMP extends TimedEntity{
if(tile != null && tile.block() instanceof PowerAcceptor){
PowerAcceptor p = (PowerAcceptor)tile.block();
p.setPower(tile, 0f);
- tile.entity.damage((int)(damage*1.6f)); //extra damage
+ tile.entity.damage((int)(damage*1.5f)); //extra damage
}
//entity may be null here, after the block is dead!
diff --git a/core/src/io/anuke/mindustry/entities/enemies/Enemy.java b/core/src/io/anuke/mindustry/entities/enemies/Enemy.java
index 820f874e09..079484fa88 100644
--- a/core/src/io/anuke/mindustry/entities/enemies/Enemy.java
+++ b/core/src/io/anuke/mindustry/entities/enemies/Enemy.java
@@ -17,6 +17,7 @@ public class Enemy extends DestructibleEntity{
public final static Color[] tierColors = { Color.valueOf("ffe451"), Color.valueOf("f48e20"), Color.valueOf("ff6757"), Color.valueOf("ff2d86") };
public final static int maxtier = 4;
public final static float maxIdle = 60*1.5f;
+ public final static float maxIdleLife = 60f*15f; //15 seconds idle = death
protected int timeid;
protected Timer timer = new Timer(5);
@@ -64,6 +65,13 @@ public class Enemy extends DestructibleEntity{
void move(){
Tile core = Vars.control.getCore();
+ if(idletime > maxIdleLife){
+ Effects.effect(Fx.shellsmoke, this);
+ Effects.effect(Fx.explosion, this);
+ remove();
+ return;
+ }
+
boolean nearCore = distanceTo(core.worldx(), core.worldy()) <= range - 18f && stopNearCore;
Vector2 vec;
diff --git a/core/src/io/anuke/mindustry/world/blocks/types/defense/ShieldBlock.java b/core/src/io/anuke/mindustry/world/blocks/types/defense/ShieldBlock.java
index 8a34f68161..4b0bba12ab 100644
--- a/core/src/io/anuke/mindustry/world/blocks/types/defense/ShieldBlock.java
+++ b/core/src/io/anuke/mindustry/world/blocks/types/defense/ShieldBlock.java
@@ -19,12 +19,12 @@ public class ShieldBlock extends PowerBlock{
public float powerDrain = 0.005f;
public float powerPerDamage = 0.2f;
public float maxRadius = 40f;
- public float radiusScale = 80f;
+ public float radiusScale = 160f;
public ShieldBlock(String name) {
super(name);
voltage = powerDrain;
- powerCapacity = 30f;
+ powerCapacity = 40f;
health = 100;
}