diff --git a/.gitignore b/.gitignore index bafe066cda..b77615b838 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ /deploy/ /desktop/packr-out/ /desktop/packr-export/ +/core/lib/ ## Java diff --git a/android/src/io/anuke/mindustry/AndroidLauncher.java b/android/src/io/anuke/mindustry/AndroidLauncher.java index f847e53a79..24f61c1e50 100644 --- a/android/src/io/anuke/mindustry/AndroidLauncher.java +++ b/android/src/io/anuke/mindustry/AndroidLauncher.java @@ -1,15 +1,14 @@ package io.anuke.mindustry; +import java.text.NumberFormat; import java.text.SimpleDateFormat; import java.util.Date; -import java.util.Locale; import com.badlogic.gdx.backends.android.AndroidApplication; import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration; - +import android.annotation.SuppressLint; import android.os.Bundle; -import io.anuke.mindustry.io.SaveIO; -import io.anuke.mindustry.io.SaveIO.FormatProvider; +import io.anuke.mindustry.io.Formatter; public class AndroidLauncher extends AndroidApplication { @Override @@ -18,13 +17,20 @@ public class AndroidLauncher extends AndroidApplication { AndroidApplicationConfiguration config = new AndroidApplicationConfiguration(); config.useImmersiveMode = true; - SaveIO.setFormatProvider(new FormatProvider(){ - SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss", Locale.ENGLISH); + Mindustry.formatter = new Formatter(){ + @SuppressLint("SimpleDateFormat") + SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm"); + @Override public String format(Date date){ return format.format(date); } - }); + + @Override + public String format(int number){ + return NumberFormat.getIntegerInstance().format(number); + } + }; initialize(new Mindustry(), config); } diff --git a/core/src/io/anuke/mindustry/Control.java b/core/src/io/anuke/mindustry/Control.java index b828f521c2..488570801a 100644 --- a/core/src/io/anuke/mindustry/Control.java +++ b/core/src/io/anuke/mindustry/Control.java @@ -95,8 +95,8 @@ public class Control extends Module{ spawns = Array.with( new EnemySpawn(Enemy.class){{ - scaling = 2; - tierscaleback = 4; + scaling = 3; + tierscaleback = 3; }}, new EnemySpawn(FastEnemy.class){{ after = 2; @@ -114,7 +114,8 @@ public class Control extends Module{ }}, new EnemySpawn(RapidEnemy.class){{ after = 7; - spacing = 4; + spacing = 3; + scaling = 3; }}, new EnemySpawn(TankEnemy.class){{ after = 4; @@ -129,13 +130,13 @@ public class Control extends Module{ ); - /* + //TODO remove this debugging for(int i = 1; i < 60; i ++){ UCore.log("\n\n--WAVE " + i); printEnemies(i); } - */ + } public void reset(){ @@ -250,13 +251,17 @@ public class Control extends Module{ } void printEnemies(int wave){ + int total = 0; for(EnemySpawn spawn : spawns){ int spawnamount = spawn.evaluate(wave, 0); + total += spawnamount; if(spawnamount > 0){ UCore.log(ClassReflection.getSimpleName(spawn.type) + " t" + spawn.tier(wave, 0) + " x" + spawnamount); } } + + UCore.log("Total: " + total); } public void enemyDeath(){ diff --git a/core/src/io/anuke/mindustry/Mindustry.java b/core/src/io/anuke/mindustry/Mindustry.java index c98842a851..ba9a7a05f7 100644 --- a/core/src/io/anuke/mindustry/Mindustry.java +++ b/core/src/io/anuke/mindustry/Mindustry.java @@ -1,12 +1,28 @@ package io.anuke.mindustry; +import java.util.Date; + import io.anuke.mindustry.GameState.State; +import io.anuke.mindustry.io.Formatter; import io.anuke.ucore.core.Inputs; import io.anuke.ucore.core.Timers; import io.anuke.ucore.modules.ModuleCore; public class Mindustry extends ModuleCore { public static String[] args = {}; + 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 void init(){ diff --git a/core/src/io/anuke/mindustry/UI.java b/core/src/io/anuke/mindustry/UI.java index 9bbe03a06a..793745e5be 100644 --- a/core/src/io/anuke/mindustry/UI.java +++ b/core/src/io/anuke/mindustry/UI.java @@ -3,8 +3,6 @@ package io.anuke.mindustry; import static io.anuke.mindustry.Vars.*; import static io.anuke.ucore.scene.actions.Actions.*; -import java.text.NumberFormat; - import com.badlogic.gdx.Application.ApplicationType; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Color; @@ -701,7 +699,7 @@ public class UI extends SceneModule{ for(Item stack : Inventory.getItemTypes()){ Image image = new Image(Draw.region("icon-" + stack.name())); - Label label = new Label("" + NumberFormat.getIntegerInstance().format(Inventory.getAmount(stack))); + Label label = new Label("" + Mindustry.formatter.format(Inventory.getAmount(stack))); label.setFontScale(fontscale*1.5f); itemtable.add(image).size(8*3).units(Unit.dp); itemtable.add(label).left(); diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index 7da5cbb7f1..382a12fc0e 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -14,7 +14,7 @@ public class Vars{ //respawn time in frames public static final float respawnduration = 60*4; //time between waves in frames - public static final float wavespace = 25*60*(android ? 1 : 1); + public static final float wavespace = 30*60*(android ? 1 : 1); //waves can last no longer than 6 minutes, otherwise the next one spawns public static final float maxwavespace = 60*60*6; //how far away from spawn points the player can't place blocks diff --git a/core/src/io/anuke/mindustry/entities/BulletType.java b/core/src/io/anuke/mindustry/entities/BulletType.java index 40ddf23f25..24c364168b 100644 --- a/core/src/io/anuke/mindustry/entities/BulletType.java +++ b/core/src/io/anuke/mindustry/entities/BulletType.java @@ -31,7 +31,7 @@ public abstract class BulletType extends BaseBulletType{ Draw.reset(); } }, - sniper = new BulletType(3f, 20){ + sniper = new BulletType(3f, 23){ public void draw(Bullet b){ Draw.color(Color.LIGHT_GRAY); Draw.thick(1f); @@ -45,7 +45,7 @@ public abstract class BulletType extends BaseBulletType{ } } }, - shell = new BulletType(1.1f, 80){ + shell = new BulletType(1.1f, 85){ { lifetime = 110f; hitsize = 8f; diff --git a/core/src/io/anuke/mindustry/entities/enemies/BlastEnemy.java b/core/src/io/anuke/mindustry/entities/enemies/BlastEnemy.java index 1e1dc26315..2142dbbf23 100644 --- a/core/src/io/anuke/mindustry/entities/enemies/BlastEnemy.java +++ b/core/src/io/anuke/mindustry/entities/enemies/BlastEnemy.java @@ -7,7 +7,7 @@ public class BlastEnemy extends Enemy{ public BlastEnemy(int spawn) { super(spawn); - maxhealth = 15; + maxhealth = 30; speed = 0.65f; bullet = null; turretrotatespeed = 0f; diff --git a/core/src/io/anuke/mindustry/entities/enemies/Enemy.java b/core/src/io/anuke/mindustry/entities/enemies/Enemy.java index 332667fa3e..0c4a934ce6 100644 --- a/core/src/io/anuke/mindustry/entities/enemies/Enemy.java +++ b/core/src/io/anuke/mindustry/entities/enemies/Enemy.java @@ -23,7 +23,7 @@ public class Enemy extends DestructibleEntity{ public final static int maxtier = 4; protected float speed = 0.3f; - protected float reload = 40; + protected float reload = 32; protected float range = 60; protected float length = 4; protected float rotatespeed = 7f; @@ -47,7 +47,7 @@ public class Enemy extends DestructibleEntity{ hitsize = 5; - maxhealth = 50; + maxhealth = 60; heal(); } @@ -104,17 +104,21 @@ public class Enemy extends DestructibleEntity{ } node = cindex; + + //node = 0; + + //set(World.spawnpoints.get(spawn).worldx(), World.spawnpoints.get(spawn).worldy()); } @Override public void added(){ if(bullet != null){ - damage = (int)(bullet.damage * (1 + (tier - 1) * 0.5f)); + damage = (int)(bullet.damage * (1 + (tier - 1) * 1f)); } maxhealth *= tier; speed += 0.04f*tier + Mathf.range(0.1f); - reload /= Math.max(tier /1.5f, 1f); + reload /= Math.max(tier / 1.5f, 1f); range += tier*5; heal(); diff --git a/core/src/io/anuke/mindustry/io/Formatter.java b/core/src/io/anuke/mindustry/io/Formatter.java new file mode 100644 index 0000000000..d6dc1278dd --- /dev/null +++ b/core/src/io/anuke/mindustry/io/Formatter.java @@ -0,0 +1,8 @@ +package io.anuke.mindustry.io; + +import java.util.Date; + +public interface Formatter{ + public String format(Date date); + public String format(int number); +} diff --git a/core/src/io/anuke/mindustry/io/SaveIO.java b/core/src/io/anuke/mindustry/io/SaveIO.java index 5f360e9841..980141f3eb 100644 --- a/core/src/io/anuke/mindustry/io/SaveIO.java +++ b/core/src/io/anuke/mindustry/io/SaveIO.java @@ -15,6 +15,7 @@ import com.badlogic.gdx.utils.TimeUtils; import com.badlogic.gdx.utils.reflect.ClassReflection; import io.anuke.mindustry.Inventory; +import io.anuke.mindustry.Mindustry; import io.anuke.mindustry.Vars; import io.anuke.mindustry.entities.enemies.*; import io.anuke.mindustry.resource.Item; @@ -85,8 +86,6 @@ public class SaveIO{ /**Save file version ID. Should be incremented every breaking release.*/ private static final int fileVersionID = 7; - private static FormatProvider provider = null; - //TODO automatic registration of types? private static final Array> enemyIDs = Array.with( Enemy.class, @@ -126,7 +125,7 @@ public class SaveIO{ try(DataInputStream stream = new DataInputStream(fileFor(slot).read())){ stream.readInt(); Date date = new Date(stream.readLong()); - return provider.format(date); + return Mindustry.formatter.format(date); }catch (IOException e){ throw new RuntimeException(e); } @@ -147,10 +146,6 @@ public class SaveIO{ return Gdx.files.local("mindustry-saves/" + slot + ".mins"); } - public static void setFormatProvider(FormatProvider prov){ - provider = prov; - } - public static void write(FileHandle file){ try(DataOutputStream stream = new DataOutputStream(file.write(false))){ @@ -290,6 +285,9 @@ public class SaveIO{ //weapons + Vars.control.getWeapons().clear(); + Vars.control.getWeapons().add(Weapon.blaster); + int weapons = stream.readByte(); for(int i = 0; i < weapons; i ++){ @@ -400,8 +398,4 @@ public class SaveIO{ throw new RuntimeException(e); } } - - public static interface FormatProvider{ - public String format(Date date); - } } diff --git a/core/src/io/anuke/mindustry/resource/Recipe.java b/core/src/io/anuke/mindustry/resource/Recipe.java index 335be66618..7b81c9cb4e 100644 --- a/core/src/io/anuke/mindustry/resource/Recipe.java +++ b/core/src/io/anuke/mindustry/resource/Recipe.java @@ -21,10 +21,10 @@ public enum Recipe{ router(distribution, ProductionBlocks.router, stack(Item.stone, 2)), junction(distribution, ProductionBlocks.junction, stack(Item.iron, 2)), - turret(defense, WeaponBlocks.turret, stack(Item.stone, 3)), - dturret(defense, WeaponBlocks.doubleturret, stack(Item.stone, 6)), - machineturret(defense, WeaponBlocks.machineturret, stack(Item.iron, 7), stack(Item.stone, 10)), - shotgunturret(defense, WeaponBlocks.shotgunturret, stack(Item.iron, 9), stack(Item.stone, 10)), + turret(defense, WeaponBlocks.turret, stack(Item.stone, 4)), + dturret(defense, WeaponBlocks.doubleturret, stack(Item.stone, 7)), + machineturret(defense, WeaponBlocks.machineturret, stack(Item.iron, 8), stack(Item.stone, 10)), + shotgunturret(defense, WeaponBlocks.shotgunturret, stack(Item.iron, 10), stack(Item.stone, 10)), flameturret(defense, WeaponBlocks.flameturret, stack(Item.iron, 12), stack(Item.steel, 9)), sniperturret(defense, WeaponBlocks.sniperturret, stack(Item.iron, 15), stack(Item.steel, 10)), laserturret(defense, WeaponBlocks.laserturret, stack(Item.steel, 10), stack(Item.titanium, 10)), @@ -32,8 +32,8 @@ public enum Recipe{ teslaturret(defense, WeaponBlocks.teslaturret, stack(Item.steel, 10), stack(Item.titanium, 15), stack(Item.dirium, 15)), plasmaturret(defense, WeaponBlocks.plasmaturret, stack(Item.steel, 10), stack(Item.titanium, 10), stack(Item.dirium, 15)), - healturret(defense, WeaponBlocks.repairturret, stack(Item.iron, 25)), - megahealturret(defense, WeaponBlocks.megarepairturret, stack(Item.iron, 15), stack(Item.steel, 25)), + healturret(defense, WeaponBlocks.repairturret, stack(Item.iron, 30)), + megahealturret(defense, WeaponBlocks.megarepairturret, stack(Item.iron, 20), stack(Item.steel, 30)), drill(production, ProductionBlocks.stonedrill, stack(Item.stone, 16)), irondrill(production, ProductionBlocks.irondrill, stack(Item.stone, 25)), diff --git a/core/src/io/anuke/mindustry/ui/UpgradeDialog.java b/core/src/io/anuke/mindustry/ui/UpgradeDialog.java index 3adf08de73..223f177c4a 100644 --- a/core/src/io/anuke/mindustry/ui/UpgradeDialog.java +++ b/core/src/io/anuke/mindustry/ui/UpgradeDialog.java @@ -60,6 +60,9 @@ public class UpgradeDialog extends Dialog{ button.setColor(Color.GRAY); }else if(!Inventory.hasItems(weapon.requirements)){ button.setDisabled(true); + }else{ + button.setDisabled(false); + button.setColor(Color.WHITE); } }); diff --git a/core/src/io/anuke/mindustry/world/Generator.java b/core/src/io/anuke/mindustry/world/Generator.java index c5bd03ee2f..60f89f5bba 100644 --- a/core/src/io/anuke/mindustry/world/Generator.java +++ b/core/src/io/anuke/mindustry/world/Generator.java @@ -58,7 +58,7 @@ public class Generator{ floor = Blocks.iron; } - if(Noise.nnoise(x, y, 6, 1) > 0.24){ + if(Noise.nnoise(x, y, 6, 1) > 0.238){ floor = Blocks.coal; } diff --git a/core/src/io/anuke/mindustry/world/blocks/ProductionBlocks.java b/core/src/io/anuke/mindustry/world/blocks/ProductionBlocks.java index c9e75ba886..4665fde7f9 100644 --- a/core/src/io/anuke/mindustry/world/blocks/ProductionBlocks.java +++ b/core/src/io/anuke/mindustry/world/blocks/ProductionBlocks.java @@ -122,7 +122,7 @@ public class ProductionBlocks{ liquidAmount = 19.99f; output = Item.coal; health = 50; - purifyTime = 80; + purifyTime = 70; } @Override @@ -135,11 +135,11 @@ public class ProductionBlocks{ { formalName = "titanium\nextractor"; input = Item.iron; - inputAmount = 11; + inputAmount = 6; inputLiquid = Liquid.water; liquidAmount = 40f; liquidCapacity = 41f; - purifyTime = 90; + purifyTime = 80; output = Item.titanium; health = 70; } diff --git a/core/src/io/anuke/mindustry/world/blocks/WeaponBlocks.java b/core/src/io/anuke/mindustry/world/blocks/WeaponBlocks.java index 23286e2abc..d49786fe43 100644 --- a/core/src/io/anuke/mindustry/world/blocks/WeaponBlocks.java +++ b/core/src/io/anuke/mindustry/world/blocks/WeaponBlocks.java @@ -98,10 +98,10 @@ public class WeaponBlocks{ { formalName = "railgun turret"; range = 120; - reload = 60f; + reload = 50f; bullet = BulletType.sniper; ammo = Item.steel; - health = 60; + health = 70; } }, @@ -111,7 +111,7 @@ public class WeaponBlocks{ rotatespeed = 0.1f; formalName = "flak turret"; range = 120; - reload = 120f; + reload = 100f; bullet = BulletType.shell; ammo = Item.coal; ammoMultiplier = 5; @@ -128,9 +128,10 @@ public class WeaponBlocks{ formalName = "laser turret"; range = 60; reload = 4f; - damage = 9; + damage = 10; ammo = Item.coal; health = 110; + ammoMultiplier = 60; } }, @@ -139,7 +140,7 @@ public class WeaponBlocks{ { formalName = "tesla turret"; range = 70; - reload = 20f; + reload = 15f; bullet = BulletType.shell; ammo = Item.coal; health = 140; @@ -151,7 +152,7 @@ public class WeaponBlocks{ Angles.translation(entity.rotation, 4); new TeslaOrb(tile.worldx() + Angles.x(), tile.worldy() + Angles.y(), - 70, (int)(8*Vars.multiplier)).add(); + 70, (int)(9*Vars.multiplier)).add(); } }, @@ -161,7 +162,7 @@ public class WeaponBlocks{ inaccuracy = 7f; formalName = "plasma turret"; range = 60f; - reload = 3f; + reload = 2f; bullet = BulletType.plasmaflame; ammo = Item.coal; health = 180; diff --git a/desktop/mindustry-saves/0.mins b/desktop/mindustry-saves/0.mins index 4646b8f1e1..dc050ee814 100644 Binary files a/desktop/mindustry-saves/0.mins and b/desktop/mindustry-saves/0.mins differ diff --git a/desktop/mindustry-saves/1.mins b/desktop/mindustry-saves/1.mins index 2b3704d019..3d8dcb4cb5 100644 Binary files a/desktop/mindustry-saves/1.mins and b/desktop/mindustry-saves/1.mins differ diff --git a/desktop/mindustry-saves/3.mins b/desktop/mindustry-saves/3.mins new file mode 100644 index 0000000000..2f98e3aa43 Binary files /dev/null and b/desktop/mindustry-saves/3.mins differ diff --git a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java index 1ccc698348..1ef0c9c4a4 100644 --- a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java +++ b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java @@ -1,5 +1,6 @@ package io.anuke.mindustry.desktop; +import java.text.NumberFormat; import java.text.SimpleDateFormat; import java.util.Date; @@ -7,8 +8,7 @@ import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application; import com.badlogic.gdx.backends.lwjgl3.Lwjgl3ApplicationConfiguration; import io.anuke.mindustry.Mindustry; -import io.anuke.mindustry.io.SaveIO; -import io.anuke.mindustry.io.SaveIO.FormatProvider; +import io.anuke.mindustry.io.Formatter; public class DesktopLauncher { @@ -20,13 +20,19 @@ public class DesktopLauncher { config.setWindowedMode(800, 600); config.setWindowIcon("sprites/icon.png"); - SaveIO.setFormatProvider(new FormatProvider(){ - SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss"); + Mindustry.formatter = new Formatter(){ + SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm"); + @Override public String format(Date date){ return format.format(date); } - }); + + @Override + public String format(int number){ + return NumberFormat.getIntegerInstance().format(number); + } + }; Mindustry.args = arg; diff --git a/gradle.properties b/gradle.properties index bad4dbbeee..db1e76fccf 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true -org.gradle.jvmargs=-Xms1024m -Xmx2048m +org.gradle.jvmargs=-Xms512m -Xmx1536m org.gradle.configureondemand=true diff --git a/html/src/io/anuke/mindustry/client/HtmlLauncher.java b/html/src/io/anuke/mindustry/client/HtmlLauncher.java index 4eb1d891d3..5bbc443c58 100644 --- a/html/src/io/anuke/mindustry/client/HtmlLauncher.java +++ b/html/src/io/anuke/mindustry/client/HtmlLauncher.java @@ -6,13 +6,14 @@ import com.badlogic.gdx.ApplicationListener; import com.badlogic.gdx.backends.gwt.GwtApplication; import com.badlogic.gdx.backends.gwt.GwtApplicationConfiguration; import com.google.gwt.dom.client.*; +import com.google.gwt.i18n.client.NumberFormat; +import com.google.gwt.i18n.shared.DateTimeFormat; import com.google.gwt.user.client.ui.HasHorizontalAlignment; import com.google.gwt.user.client.ui.HasVerticalAlignment; import com.google.gwt.user.client.ui.VerticalPanel; import io.anuke.mindustry.Mindustry; -import io.anuke.mindustry.io.SaveIO; -import io.anuke.mindustry.io.SaveIO.FormatProvider; +import io.anuke.mindustry.io.Formatter; public class HtmlLauncher extends GwtApplication { static final int WIDTH = 800; @@ -54,12 +55,19 @@ public class HtmlLauncher extends GwtApplication { } }); - SaveIO.setFormatProvider(new FormatProvider(){ + Mindustry.formatter = new Formatter(){ + DateTimeFormat format = DateTimeFormat.getFormat("EEE, dd MMM yyyy HH:mm:ss"); + @Override public String format(Date date){ - return "saving not supported"; + return format.format(date); } - }); + + @Override + public String format(int number){ + return NumberFormat.getDecimalFormat().format(number); + } + }; return new Mindustry(); }