From 0c6578c229f1a830be1497c491359e87f336cf61 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 26 Nov 2017 23:20:43 -0500 Subject: [PATCH] Implemented Fortress enemy spawning, added level save display --- core/src/io/anuke/mindustry/core/Control.java | 8 +++++- .../entities/enemies/BlastEnemy.java | 1 + .../mindustry/entities/enemies/Enemy.java | 5 ++-- .../mindustry/entities/enemies/FastEnemy.java | 1 + .../entities/enemies/FlamerEnemy.java | 1 + .../entities/enemies/FortressEnemy.java | 5 ++-- .../entities/enemies/HealerEnemy.java | 1 + .../entities/enemies/MortarEnemy.java | 3 ++- .../entities/enemies/RapidEnemy.java | 3 ++- .../mindustry/entities/enemies/TankEnemy.java | 2 ++ .../entities/enemies/TitanEnemy.java | 3 ++- core/src/io/anuke/mindustry/io/SaveIO.java | 23 +++++++++++++----- .../src/io/anuke/mindustry/ui/LoadDialog.java | 5 ++-- desktop/mindustry-saves/0.mins | Bin 1399 -> 18939 bytes desktop/mindustry-saves/3.mins | Bin 1502 -> 2801 bytes 15 files changed, 45 insertions(+), 16 deletions(-) diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index 507a847371..11d41b6fc3 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -111,10 +111,15 @@ public class Control extends Module{ spawns = Array.with( new EnemySpawn(TitanEnemy.class){{ - after = 4; + after = 5; spacing = 2; scaling = 5; }}, + new EnemySpawn(FortressEnemy.class){{ + after = 12; + spacing = 3; + scaling = 5; + }}, new EnemySpawn(HealerEnemy.class){{ scaling = 3; spacing = 2; @@ -442,6 +447,7 @@ public class Control extends Module{ if(Inputs.keyUp(Keys.C)){ enemyGroup.clear(); + enemies = 0; } if(Inputs.keyUp(Keys.F)){ diff --git a/core/src/io/anuke/mindustry/entities/enemies/BlastEnemy.java b/core/src/io/anuke/mindustry/entities/enemies/BlastEnemy.java index 85254a6e80..9bf13cc50d 100644 --- a/core/src/io/anuke/mindustry/entities/enemies/BlastEnemy.java +++ b/core/src/io/anuke/mindustry/entities/enemies/BlastEnemy.java @@ -13,6 +13,7 @@ public class BlastEnemy extends Enemy{ speed = 0.65f; bullet = null; turretrotatespeed = 0f; + mass = 0.8f; heal(); } diff --git a/core/src/io/anuke/mindustry/entities/enemies/Enemy.java b/core/src/io/anuke/mindustry/entities/enemies/Enemy.java index cf29ef468c..539648be3c 100644 --- a/core/src/io/anuke/mindustry/entities/enemies/Enemy.java +++ b/core/src/io/anuke/mindustry/entities/enemies/Enemy.java @@ -36,6 +36,7 @@ public class Enemy extends DestructibleEntity{ protected int spawned = 0; protected float angle; protected boolean targetCore = false; + protected float mass = 1f; public int spawn; public int node = -1; @@ -80,18 +81,18 @@ public class Enemy extends DestructibleEntity{ float avoidSpeed = 0.1f; Entities.getNearby(Entities.getGroup(Enemy.class), x, y, range, other -> { + Enemy enemy = (Enemy)other; float dst = other.distanceTo(this); if(other == this) return; if(dst < shiftRange){ - float scl = Mathf.clamp(1.4f - dst / shiftRange); + float scl = Mathf.clamp(1.4f - dst / shiftRange) * enemy.mass * 1f/mass; shift.add((x - other.x) * scl, (y - other.y) * scl); }else if(dst < avoidRange){ Tmp.v2.set((x - other.x), (y - other.y)).setLength(avoidSpeed); shift.add(Tmp.v2); } - }); shift.limit(1f); diff --git a/core/src/io/anuke/mindustry/entities/enemies/FastEnemy.java b/core/src/io/anuke/mindustry/entities/enemies/FastEnemy.java index 1922a421d7..cd71689a20 100644 --- a/core/src/io/anuke/mindustry/entities/enemies/FastEnemy.java +++ b/core/src/io/anuke/mindustry/entities/enemies/FastEnemy.java @@ -7,6 +7,7 @@ public class FastEnemy extends Enemy{ speed = 0.7f; reload = 30; + mass = 0.2f; maxhealth = 30; heal(); diff --git a/core/src/io/anuke/mindustry/entities/enemies/FlamerEnemy.java b/core/src/io/anuke/mindustry/entities/enemies/FlamerEnemy.java index bf2af7ec6e..d2832f1f3a 100644 --- a/core/src/io/anuke/mindustry/entities/enemies/FlamerEnemy.java +++ b/core/src/io/anuke/mindustry/entities/enemies/FlamerEnemy.java @@ -13,6 +13,7 @@ public class FlamerEnemy extends Enemy{ reload = 6; bullet = BulletType.flameshot; shootsound = "flame"; + mass = 1.5f; range = 40; diff --git a/core/src/io/anuke/mindustry/entities/enemies/FortressEnemy.java b/core/src/io/anuke/mindustry/entities/enemies/FortressEnemy.java index 9a387c5c22..94f82ce501 100644 --- a/core/src/io/anuke/mindustry/entities/enemies/FortressEnemy.java +++ b/core/src/io/anuke/mindustry/entities/enemies/FortressEnemy.java @@ -16,14 +16,15 @@ public class FortressEnemy extends Enemy{ public FortressEnemy(int spawn) { super(spawn); - speed = 0.1f; + speed = 0.12f; reload = 90; maxhealth = 700; range = 70f; bullet = BulletType.yellowshell; - hitbox.setSize(9f); + hitbox.setSize(10f); turretrotatespeed = rotatespeed = 0.08f; length = 7f; + mass = 7f; heal(); } diff --git a/core/src/io/anuke/mindustry/entities/enemies/HealerEnemy.java b/core/src/io/anuke/mindustry/entities/enemies/HealerEnemy.java index ae3ab9675c..45fe62720a 100644 --- a/core/src/io/anuke/mindustry/entities/enemies/HealerEnemy.java +++ b/core/src/io/anuke/mindustry/entities/enemies/HealerEnemy.java @@ -24,6 +24,7 @@ public class HealerEnemy extends Enemy{ range = 30f; alwaysRotate = false; targetCore = false; + mass = 1.1f; heal(); } diff --git a/core/src/io/anuke/mindustry/entities/enemies/MortarEnemy.java b/core/src/io/anuke/mindustry/entities/enemies/MortarEnemy.java index cd78c201e2..adfac7e879 100644 --- a/core/src/io/anuke/mindustry/entities/enemies/MortarEnemy.java +++ b/core/src/io/anuke/mindustry/entities/enemies/MortarEnemy.java @@ -12,8 +12,9 @@ public class MortarEnemy extends Enemy{ reload = 100f; bullet = BulletType.shell; turretrotatespeed = 0.15f; - rotatespeed = 7f; + rotatespeed = 0.05f; range = 120f; + mass = 1.2f; heal(); } diff --git a/core/src/io/anuke/mindustry/entities/enemies/RapidEnemy.java b/core/src/io/anuke/mindustry/entities/enemies/RapidEnemy.java index 5e5b7b814a..3f06326a86 100644 --- a/core/src/io/anuke/mindustry/entities/enemies/RapidEnemy.java +++ b/core/src/io/anuke/mindustry/entities/enemies/RapidEnemy.java @@ -9,11 +9,12 @@ public class RapidEnemy extends Enemy{ reload = 8; bullet = BulletType.purple; - rotatespeed = 30f; + rotatespeed = 0.08f; maxhealth = 260; speed = 0.27f; heal(); hitbox.setSize(8f); + mass = 3f; range = 70; } diff --git a/core/src/io/anuke/mindustry/entities/enemies/TankEnemy.java b/core/src/io/anuke/mindustry/entities/enemies/TankEnemy.java index 153e79471c..265d526c28 100644 --- a/core/src/io/anuke/mindustry/entities/enemies/TankEnemy.java +++ b/core/src/io/anuke/mindustry/entities/enemies/TankEnemy.java @@ -13,8 +13,10 @@ public class TankEnemy extends Enemy{ maxhealth = 350; speed = 0.2f; reload = 90f; + rotatespeed = 0.06f; bullet = BulletType.small; length = 3f; + mass = 1.4f; } void shoot(){ diff --git a/core/src/io/anuke/mindustry/entities/enemies/TitanEnemy.java b/core/src/io/anuke/mindustry/entities/enemies/TitanEnemy.java index d8b90e7e58..d2e3d14318 100644 --- a/core/src/io/anuke/mindustry/entities/enemies/TitanEnemy.java +++ b/core/src/io/anuke/mindustry/entities/enemies/TitanEnemy.java @@ -10,12 +10,13 @@ public class TitanEnemy extends Enemy{ public TitanEnemy(int spawn) { super(spawn); - speed = 0.1f; + speed = 0.14f; reload = 30; maxhealth = 400; range = 60f; bullet = BulletType.small; hitbox.setSize(7f); + mass = 4f; heal(); diff --git a/core/src/io/anuke/mindustry/io/SaveIO.java b/core/src/io/anuke/mindustry/io/SaveIO.java index 8358224742..487e249d0c 100644 --- a/core/src/io/anuke/mindustry/io/SaveIO.java +++ b/core/src/io/anuke/mindustry/io/SaveIO.java @@ -37,6 +37,7 @@ import io.anuke.ucore.entities.Entities; * Wave countdown time (float) * * Gamemode Ordinal (byte) + * Map ordinal (byte) * * Player X (float) * Player Y (float) @@ -63,7 +64,6 @@ import io.anuke.ucore.entities.Entities; * * * --MAP DATA-- - * Map ID (byte) * Seed (int) * Amount of tiles (int) * (tile list) @@ -82,7 +82,7 @@ import io.anuke.ucore.entities.Entities; */ public class SaveIO{ /**Save file version ID. Should be incremented every breaking release.*/ - private static final int fileVersionID = 10; + private static final int fileVersionID = 11; //TODO automatic registration of types? private static final Array> enemyIDs = Array.with( @@ -138,6 +138,7 @@ public class SaveIO{ stream.readInt(); //read version stream.readLong(); //read last saved time stream.readByte(); //read the gamemode + stream.readByte(); //read the map return stream.readInt(); //read the wave }catch (IOException e){ throw new RuntimeException(e); @@ -155,6 +156,18 @@ public class SaveIO{ } } + public static Map getMap(int slot){ + + try(DataInputStream stream = new DataInputStream(fileFor(slot).read())){ + stream.readInt(); //read version + stream.readLong(); //read last saved time + stream.readByte(); //read the gamemode + return Map.values()[stream.readByte()]; //read the map + }catch (IOException e){ + throw new RuntimeException(e); + } + } + public static FileHandle fileFor(int slot){ return Gdx.files.local("mindustry-saves/" + slot + ".mins"); } @@ -169,6 +182,7 @@ public class SaveIO{ //--GENERAL STATE-- stream.writeByte(Vars.control.getMode().ordinal()); //gamemode + stream.writeByte(Vars.world.getMap().ordinal()); //map ID stream.writeInt(Vars.control.getWave()); //wave stream.writeFloat(Vars.control.getWaveCountdown()); //wave countdown @@ -219,9 +233,6 @@ public class SaveIO{ //--MAP DATA-- - //map ID - stream.writeByte(Vars.world.getMap().ordinal()); - //seed stream.writeInt(Vars.world.getSeed()); @@ -286,6 +297,7 @@ public class SaveIO{ //general state byte mode = stream.readByte(); + byte mapid = stream.readByte(); int wave = stream.readInt(); float wavetime = stream.readFloat(); @@ -364,7 +376,6 @@ public class SaveIO{ //map - int mapid = stream.readByte(); int seed = stream.readInt(); int tiles = stream.readInt(); diff --git a/core/src/io/anuke/mindustry/ui/LoadDialog.java b/core/src/io/anuke/mindustry/ui/LoadDialog.java index 1e69e792f6..6f90cfc2f2 100644 --- a/core/src/io/anuke/mindustry/ui/LoadDialog.java +++ b/core/src/io/anuke/mindustry/ui/LoadDialog.java @@ -46,8 +46,9 @@ public class LoadDialog extends FloatingDialog{ button.row(); - Label info = new Label("[gray]" + (!SaveIO.isSaveValid(i) ? "" : SaveIO.getMode(slot) + ", Wave " + - SaveIO.getWave(slot) + "\nLast Saved: " + SaveIO.getTimeString(i))); + Label info = new Label("[gray]" + (!SaveIO.isSaveValid(i) ? "" : SaveIO.getMode(slot) + ", " + + SaveIO.getMap(slot) + + ", Wave " + SaveIO.getWave(slot) + "\nLast Saved: " + SaveIO.getTimeString(i))); info.setAlignment(Align.center, Align.center); button.add(info).padBottom(2).padTop(6); diff --git a/desktop/mindustry-saves/0.mins b/desktop/mindustry-saves/0.mins index 5df3888dda46cb0f06dc9b5ea5019507a7044e69..fcc59b83e9969a47cea91e1fa1b9d194d2886cef 100644 GIT binary patch literal 18939 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 R;ujL-DJtk9?T%}b{s&CsT(STF literal 1502 zcmZvc%WG3X6vofJNm^2@F^{%Mn)|3}O-<5hpJ0ue$3Vp@T57d!bfF6=ZWKh_NEf2G z5ZqKPF2#jNMHEC7tF~34A_d=ng1B_yMiU$aY|nMt)s%2Ipu`?viyBb*dr&|J=#Fp)C;-A6p@jZ??h3ej=P}DJy1?jYYtlCKB!ZX zorf0d0kzD5x|G&YfY!MM)U_3qeF)mn3ral#W&1!IAA>TAHY@7yhZ`OM#T8`~B?jT9 zo`AZag7Vuy(P2>gGf;RtD6h!aNzPrf(=A`d{Oa0VKPcKNF343!!9aco-vnH9H}E(LX>%1yTUL<_e(vMaM5rPbP8g(dFS z#J^OBjB4%KjKx~b^m702Yr452-x#08s?*D=)5~^qwbyM3XJh$S;5IatR@delzjuj~ z{DFoPW#2$6CI!qO79iKDdJ) tK#>EWmN8KJBPciyTCXVdNok)!)d