Balanced all enemies, tweaked waves

This commit is contained in:
Anuken 2017-12-03 12:02:48 -05:00
parent 9cadb08024
commit 19a4dd41e3
34 changed files with 304 additions and 138 deletions

View File

@ -43,7 +43,7 @@ public class Vars{
//whether to draw chunk borders
public static boolean debugChunks = false;
//whether turrets have infinite ammo (only with debug)
public static boolean infiniteAmmo = false;
public static boolean infiniteAmmo = true;
//whether to show paths of enemies
public static boolean showPaths = true;
//number of save slots-- increasing may lead to layout issues

View File

@ -9,14 +9,15 @@ import com.badlogic.gdx.input.GestureDetector;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.ObjectMap;
import com.badlogic.gdx.utils.reflect.ClassReflection;
import com.badlogic.gdx.utils.reflect.Constructor;
import io.anuke.mindustry.Mindustry;
import io.anuke.mindustry.Vars;
import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.entities.*;
import io.anuke.mindustry.entities.effect.Fx;
import io.anuke.mindustry.entities.enemies.*;
import io.anuke.mindustry.entities.enemies.BlastEnemy;
import io.anuke.mindustry.entities.enemies.Enemy;
import io.anuke.mindustry.entities.enemies.HealerEnemy;
import io.anuke.mindustry.input.AndroidInput;
import io.anuke.mindustry.input.GestureHandler;
import io.anuke.mindustry.input.Input;
@ -113,61 +114,8 @@ public class Control extends Module{
player = new Player();
spawns = Array.with(
new EnemySpawn(TitanEnemy.class){{
after = 5;
spacing = 2;
scaling = 5;
}},
new EnemySpawn(FortressEnemy.class){{
after = 12;
spacing = 3;
scaling = 5;
}},
new EnemySpawn(HealerEnemy.class){{
scaling = 3;
spacing = 2;
after = 8;
}},
new EnemySpawn(Enemy.class){{
scaling = 3;
tierscaleback = 3;
}},
new EnemySpawn(FastEnemy.class){{
after = 2;
scaling = 3;
}},
new EnemySpawn(FlamerEnemy.class){{
after = 14;
spacing = 5;
scaling = 2;
}},
new EnemySpawn(BlastEnemy.class){{
after = 12;
spacing = 2;
scaling = 3;
}},
new EnemySpawn(RapidEnemy.class){{
after = 7;
spacing = 3;
scaling = 3;
}},
new EnemySpawn(EmpEnemy.class){{
after = 19;
spacing = 3;
scaling = 5;
}},
new EnemySpawn(TankEnemy.class){{
after = 4;
spacing = 2;
scaling = 3;
}},
new EnemySpawn(MortarEnemy.class){{
after = 20;
spacing = 3;
scaling = 5;
}}
);
spawns = WaveCreator.getSpawns();
WaveCreator.testWaves(1, 30);
}
public void reset(){
@ -290,9 +238,9 @@ public class Control extends Module{
Timers.run(index*50f, ()->{
try{
Constructor c = ClassReflection.getConstructor(spawn.type, int.class);
Enemy enemy = (Enemy)c.newInstance(fl);
Enemy enemy = ClassReflection.newInstance(spawn.type);
enemy.set(tile.worldx() + Mathf.range(range), tile.worldy() + Mathf.range(range));
enemy.spawn = fl;
enemy.tier = spawn.tier(wave, fl);
Effects.effect(Fx.spawn, enemy);
enemy.add(enemyGroup);
@ -466,15 +414,15 @@ public class Control extends Module{
if(Inputs.keyUp(Keys.Y)){
if(Inputs.keyDown(Keys.SHIFT_LEFT)){
new HealerEnemy(0).set(player.x, player.y).add();
new HealerEnemy().set(player.x, player.y).add();
}else{
float px = player.x, py = player.y;
Timers.run(30f, ()->new BlastEnemy(0).set(px, py).add());
Timers.run(30f, ()->new BlastEnemy().set(px, py).add());
}
}
}
if(shouldUpdateItems && Timers.get("updateItems", 8)){
if(shouldUpdateItems && (Timers.get("updateItems", 8) || GameState.is(State.paused))){
ui.updateItems();
shouldUpdateItems = false;
}

View File

@ -232,14 +232,14 @@ public abstract class BulletType extends BaseBulletType<Bullet>{
}
public void draw(Bullet b){}
},
small = new BulletType(1.5f, 1){
small = new BulletType(1.5f, 2){
public void draw(Bullet b){
Draw.color(glowy);
Draw.rect("shot", b.x, b.y, b.angle() - 45);
Draw.reset();
}
},
smallSlow = new BulletType(1.2f, 1){
smallSlow = new BulletType(1.2f, 2){
public void draw(Bullet b){
Draw.color("orange");
Draw.rect("shot", b.x, b.y, b.angle() - 45);

View File

@ -4,14 +4,24 @@ import io.anuke.mindustry.entities.enemies.Enemy;
import io.anuke.ucore.util.Mathf;
public class EnemySpawn{
/**The enemy type spawned*/
public final Class<? extends Enemy> type;
/**When this spawns should end*/
protected int before = Integer.MAX_VALUE;
/**When this spawns should start*/
protected int after;
/**The spacing, in waves, of spawns. 2 = spawns every other wave*/
protected int spacing = 1;
/**How many waves need to pass after the start of this spawn for the tier to increase by one*/
protected int tierscale = 15;
/**How many less enemies there are, every time the tier increases*/
protected int tierscaleback = 1;
/**Maximum amount of enemies that spawn*/
protected int max = 17;
/**How many waves need to pass before the amount of enemies increases by 1*/
protected float scaling = 9999f;
/**Amount of enemies spawned initially, with no scaling*/
protected int amount = 1;
public EnemySpawn(Class<? extends Enemy> type){
this.type = type;
@ -21,7 +31,7 @@ public class EnemySpawn{
if(wave < after || wave > before || (wave - after) % spacing != 0){
return 0;
}
return Math.min(1 * Math.max((int)((wave / spacing) / scaling), 1) - (tier(wave, lane)-1) * tierscaleback, max);
return Math.min(amount-1 + 1 * Math.max((int)((wave / spacing) / scaling), 1) - (tier(wave, lane)-1) * tierscaleback, max);
}
public int tier(int wave, int lane){

View File

@ -0,0 +1,201 @@
package io.anuke.mindustry.entities;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.reflect.ClassReflection;
import io.anuke.mindustry.entities.enemies.*;
public class WaveCreator{
public static Array<EnemySpawn> getSpawns(){
//TODO
//Gdx.app.exit();
return Array.with(
new EnemySpawn(Enemy.class){{
scaling = 1;
before = 3;
}},
new EnemySpawn(FastEnemy.class){{
scaling = 1;
after = 3;
spacing = 5;
amount = 4;
tierscaleback = 0;
}},
new EnemySpawn(BlastEnemy.class){{
after = 4;
amount = 3;
spacing = 5;
scaling = 1;
tierscaleback = 0;
}},
new EnemySpawn(TankEnemy.class){{
after = 5;
spacing = 5;
scaling = 1;
amount = 2;
}},
new EnemySpawn(RapidEnemy.class){{
after = 7;
spacing = 5;
scaling = 2;
amount = 3;
}},
new EnemySpawn(HealerEnemy.class){{
after = 5;
spacing = 5;
scaling = 1;
amount = 1;
}},
new EnemySpawn(TitanEnemy.class){{
after = 6;
amount = 2;
spacing = 5;
scaling = 3;
}},
new EnemySpawn(FlamerEnemy.class){{
after = 12;
amount = 3;
spacing = 5;
scaling = 2;
}},
new EnemySpawn(BlastEnemy.class){{
after = 4 + 5 + 5;
amount = 3;
spacing = 5;
scaling = 1;
tierscaleback = 0;
}},
//boss wave
new EnemySpawn(FortressEnemy.class){{
after = 16;
amount = 2;
spacing = 5;
scaling = 1;
}},
new EnemySpawn(TitanEnemy.class){{
after = 16;
amount = 2;
spacing = 5;
scaling = 3;
tierscaleback = 0;
}},
new EnemySpawn(HealerEnemy.class){{
after = 16;
spacing = 5;
scaling = 1;
amount = 2;
}},
//end boss wave
//enchanced boss wave
new EnemySpawn(MortarEnemy.class){{
after = 16 + 5;
amount = 1;
spacing = 5;
scaling = 1;
}},
new EnemySpawn(EmpEnemy.class){{
after = 16 + 5;
amount = 1;
spacing = 5;
scaling = 1;
}}
//end enchanced boss wave
);
}
public static Array<EnemySpawn> getSpawnsOld(){
return Array.with(
new EnemySpawn(Enemy.class){{
scaling = 2;
before = 4;
}},
new EnemySpawn(Enemy.class){{
scaling = 3;
tierscaleback = 3;
spacing = 2;
after = 4;
}},
new EnemySpawn(TitanEnemy.class){{
after = 5;
spacing = 2;
scaling = 5;
}},
new EnemySpawn(FortressEnemy.class){{
after = 12;
spacing = 3;
scaling = 5;
}},
new EnemySpawn(HealerEnemy.class){{
scaling = 3;
spacing = 2;
after = 8;
}},
new EnemySpawn(FastEnemy.class){{
after = 2;
scaling = 3;
}},
new EnemySpawn(FlamerEnemy.class){{
after = 14;
spacing = 5;
scaling = 2;
}},
new EnemySpawn(BlastEnemy.class){{
after = 12;
spacing = 2;
scaling = 3;
}},
new EnemySpawn(RapidEnemy.class){{
after = 7;
spacing = 3;
scaling = 3;
}},
new EnemySpawn(EmpEnemy.class){{
after = 19;
spacing = 3;
scaling = 5;
}},
new EnemySpawn(TankEnemy.class){{
after = 4;
spacing = 2;
scaling = 3;
}},
new EnemySpawn(MortarEnemy.class){{
after = 20;
spacing = 3;
scaling = 5;
}}
);
}
public static void testWaves(int from, int to){
Array<EnemySpawn> spawns = getSpawns();
for(int i = from; i <= to; i ++){
System.out.print(i+": ");
int total = 0;
for(EnemySpawn spawn : spawns){
int a = spawn.evaluate(i, 0);
int t = spawn.tier(i, 0);
total += a;
if(a > 0){
System.out.print(a+"x" + ClassReflection.getSimpleName(spawn.type) + "-" + t + " ");
}
}
System.out.print(" (" + total + ")");
System.out.println();
}
}
}

View File

@ -7,10 +7,9 @@ import io.anuke.mindustry.entities.TileEntity;
public class BlastEnemy extends Enemy{
public BlastEnemy(int spawn) {
super(spawn);
public BlastEnemy() {
maxhealth = 30;
speed = 0.65f;
speed = 0.7f;
bullet = null;
turretrotatespeed = 0f;
mass = 0.8f;

View File

@ -4,8 +4,7 @@ import io.anuke.mindustry.entities.BulletType;
public class EmpEnemy extends Enemy{
public EmpEnemy(int spawn) {
super(spawn);
public EmpEnemy() {
speed = 0.27f;
reload = 70;

View File

@ -22,7 +22,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;
protected float speed = 0.3f;
protected float speed = 0.4f;
protected float reload = 32;
protected float range = 60;
protected float length = 4;
@ -47,9 +47,7 @@ public class Enemy extends DestructibleEntity{
public Entity target;
public int tier = 1;
public Enemy(int spawn) {
this.spawn = spawn;
public Enemy() {
hitbox.setSize(5f);
hitboxTile.setSize(4f);

View File

@ -2,14 +2,13 @@ package io.anuke.mindustry.entities.enemies;
public class FastEnemy extends Enemy{
public FastEnemy(int spawn) {
super(spawn);
public FastEnemy() {
speed = 0.7f;
reload = 30;
speed = 0.73f;
reload = 25;
mass = 0.2f;
maxhealth = 30;
maxhealth = 40;
heal();
}

View File

@ -4,8 +4,7 @@ import io.anuke.mindustry.entities.BulletType;
public class FlamerEnemy extends Enemy{
public FlamerEnemy(int spawn) {
super(spawn);
public FlamerEnemy() {
speed = 0.35f;

View File

@ -13,10 +13,9 @@ public class FortressEnemy extends Enemy{
float spawnTime = 240;
boolean deployed;
public FortressEnemy(int spawn) {
super(spawn);
public FortressEnemy() {
speed = 0.12f;
speed = 0.2f;
reload = 90;
maxhealth = 700;
range = 70f;
@ -38,7 +37,8 @@ public class FortressEnemy extends Enemy{
if(Timers.get(this, "spawn", spawnTime) && spawned < maxSpawn){
Angles.translation(angle, 20f);
FastEnemy enemy = new FastEnemy(spawn);
FastEnemy enemy = new FastEnemy();
enemy.spawn = spawn;
enemy.tier = this.tier;
enemy.spawner = this;
enemy.set(x + Angles.x(), y + Angles.y());

View File

@ -13,8 +13,7 @@ import io.anuke.ucore.util.Angles;
public class HealerEnemy extends Enemy{
public HealerEnemy(int spawn) {
super(spawn);
public HealerEnemy() {
speed = 0.2f;
reload = 14;

View File

@ -4,11 +4,10 @@ import io.anuke.mindustry.entities.BulletType;
public class MortarEnemy extends Enemy{
public MortarEnemy(int spawn) {
super(spawn);
public MortarEnemy() {
maxhealth = 200;
speed = 0.2f;
speed = 0.25f;
reload = 100f;
bullet = BulletType.shell;
turretrotatespeed = 0.15f;

View File

@ -4,14 +4,13 @@ import io.anuke.mindustry.entities.BulletType;
public class RapidEnemy extends Enemy{
public RapidEnemy(int spawn) {
super(spawn);
public RapidEnemy() {
reload = 8;
bullet = BulletType.purple;
rotatespeed = 0.08f;
maxhealth = 260;
speed = 0.27f;
speed = 0.33f;
heal();
hitbox.setSize(8f);
mass = 3f;

View File

@ -7,11 +7,10 @@ import io.anuke.ucore.util.Angles;
public class TankEnemy extends Enemy{
public TankEnemy(int spawn) {
super(spawn);
public TankEnemy() {
maxhealth = 350;
speed = 0.2f;
speed = 0.24f;
reload = 90f;
rotatespeed = 0.06f;
bullet = BulletType.small;

View File

@ -9,8 +9,7 @@ import io.anuke.ucore.core.Timers;
public class TargetEnemy extends Enemy{
public TargetEnemy(int spawn){
super(0);
public TargetEnemy(){
speed = 0f;
maxhealth = 10;
}
@ -48,7 +47,7 @@ public class TargetEnemy extends Enemy{
public void onDeath(){
super.onDeath();
Timers.run(100f, ()->{
new TargetEnemy(0).set(x, y).add();
new TargetEnemy().set(x, y).add();
});
}
}

View File

@ -5,8 +5,7 @@ import io.anuke.ucore.core.Timers;
public class TestEnemy extends Enemy{
boolean dir = false;
public TestEnemy(int spawn) {
super(spawn);
public TestEnemy() {
maxhealth = 99999;
heal();
}

View File

@ -7,12 +7,11 @@ import io.anuke.ucore.util.Mathf;
public class TitanEnemy extends Enemy{
public TitanEnemy(int spawn) {
super(spawn);
public TitanEnemy() {
speed = 0.14f;
speed = 0.22f;
reload = 30;
maxhealth = 400;
maxhealth = 421;
range = 60f;
bullet = BulletType.small;
hitbox.setSize(7f);
@ -27,7 +26,7 @@ public class TitanEnemy extends Enemy{
@Override
void updateShooting(){
Timers.get(this, "salvo", 250);
Timers.get(this, "salvo", 240);
if(Timers.getTime(this, "salvo") < 60){
if(Timers.get(this, "salvoShoot", 6)){
@ -35,7 +34,7 @@ public class TitanEnemy extends Enemy{
}
}
if(Timers.get(this, "shotgun", 90)){
if(Timers.get(this, "shotgun", 80)){
Angles.shotgun(5, 10f, 0f, f->{
shoot(BulletType.smallSlow, f);
});

View File

@ -0,0 +1,11 @@
package io.anuke.mindustry.entities.enemies.flying;
import io.anuke.mindustry.entities.enemies.Enemy;
public class FlyingEnemy extends Enemy{
public FlyingEnemy() {
}
}

View File

@ -7,6 +7,8 @@ import com.badlogic.gdx.Input.Keys;
import com.badlogic.gdx.math.Vector2;
import io.anuke.mindustry.Vars;
import io.anuke.mindustry.core.GameState;
import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.resource.ItemStack;
import io.anuke.mindustry.resource.Weapon;
import io.anuke.mindustry.world.Tile;
@ -23,7 +25,7 @@ public class Input{
//player is dead
if(player.health <= 0) return;
if(Inputs.scrolled()){
if(Inputs.scrolled() && GameState.is(State.playing)){
Vars.renderer.scaleCamera(Inputs.scroll());
}

View File

@ -357,7 +357,8 @@ public class SaveIO{
int health = stream.readInt();
try{
Enemy enemy = (Enemy)ClassReflection.getConstructor(enemyIDs.get(type), int.class).newInstance(lane);
Enemy enemy = ClassReflection.newInstance(enemyIDs.get(type));
enemy.spawn = lane;
enemy.health = health;
enemy.x = x;
enemy.y = y;

View File

@ -9,4 +9,8 @@ public class ItemStack{
this.item = item;
this.amount = amount;
}
public boolean equals(ItemStack other){
return other != null && other.item == item && other.amount == amount;
}
}

View File

@ -19,7 +19,7 @@ public enum Recipe{
duriumwalllarge(defense, DefenseBlocks.diriumwalllarge, stack(Item.dirium, 8)),
door(defense, DefenseBlocks.door, stack(Item.steel, 3), stack(Item.iron, 3)),
largedoor(defense, DefenseBlocks.largedoor, stack(Item.steel, 3*4), stack(Item.iron, 3*4)),
titaniumshieldwall(defense, DefenseBlocks.titaniumshieldwall, stack(Item.titanium, 2)),
titaniumshieldwall(defense, DefenseBlocks.titaniumshieldwall, stack(Item.titanium, 3)),
conveyor(distribution, DistributionBlocks.conveyor, stack(Item.stone, 1)),
steelconveyor(distribution, DistributionBlocks.steelconveyor, stack(Item.steel, 1)),
@ -43,36 +43,36 @@ public enum Recipe{
mortarturret(weapon, WeaponBlocks.mortarturret, stack(Item.steel, 20), stack(Item.titanium, 15)),
teslaturret(weapon, WeaponBlocks.teslaturret, stack(Item.steel, 10), stack(Item.titanium, 15), stack(Item.dirium, 15)),
plasmaturret(weapon, WeaponBlocks.plasmaturret, stack(Item.steel, 10), stack(Item.titanium, 10), stack(Item.dirium, 15)),
chainturret(weapon, WeaponBlocks.chainturret, stack(Item.steel, 10), stack(Item.titanium, 10), stack(Item.dirium, 15)),
titanturret(weapon, WeaponBlocks.titanturret, stack(Item.steel, 10), stack(Item.titanium, 10), stack(Item.dirium, 15)),
chainturret(weapon, WeaponBlocks.chainturret, stack(Item.steel, 35), stack(Item.titanium, 25), stack(Item.dirium, 35)),
titanturret(weapon, WeaponBlocks.titanturret, stack(Item.steel, 50), stack(Item.titanium, 45), stack(Item.dirium, 55)),
smelter(crafting, ProductionBlocks.smelter, stack(Item.stone, 40), stack(Item.iron, 40)),
crucible(crafting, ProductionBlocks.crucible, stack(Item.titanium, 40), stack(Item.steel, 40)),
coalpurifier(crafting, ProductionBlocks.coalpurifier, stack(Item.steel, 10), stack(Item.iron, 10)),
titaniumpurifier(crafting, ProductionBlocks.titaniumpurifier, stack(Item.steel, 30), stack(Item.iron, 30)),
oilrefinery(crafting, ProductionBlocks.oilrefinery, stack(Item.steel, 30), stack(Item.iron, 30)),
stoneformer(crafting, ProductionBlocks.stoneformer, stack(Item.steel, 30), stack(Item.iron, 30)),
lavasmelter(crafting, ProductionBlocks.lavasmelter, stack(Item.steel, 30), stack(Item.iron, 30)),
oilrefinery(crafting, ProductionBlocks.oilrefinery, stack(Item.steel, 15), stack(Item.iron, 15)),
stoneformer(crafting, ProductionBlocks.stoneformer, stack(Item.steel, 10), stack(Item.iron, 10)),
lavasmelter(crafting, ProductionBlocks.lavasmelter, stack(Item.steel, 20), stack(Item.iron, 20), stack(Item.titanium, 10)),
stonedrill(production, ProductionBlocks.stonedrill, stack(Item.stone, 12)),
irondrill(production, ProductionBlocks.irondrill, stack(Item.stone, 25)),
coaldrill(production, ProductionBlocks.coaldrill, stack(Item.stone, 25), stack(Item.iron, 40)),
titaniumdrill(production, ProductionBlocks.titaniumdrill, stack(Item.iron, 40), stack(Item.steel, 40)),
uraniumdrill(production, ProductionBlocks.uraniumdrill, stack(Item.titanium, 20), stack(Item.steel, 40)),
omnidrill(production, ProductionBlocks.omnidrill, stack(Item.titanium, 20), stack(Item.dirium, 20)),
uraniumdrill(production, ProductionBlocks.uraniumdrill, stack(Item.iron, 40), stack(Item.steel, 40)),
omnidrill(production, ProductionBlocks.omnidrill, stack(Item.titanium, 30), stack(Item.dirium, 20)),
coalgenerator(power, ProductionBlocks.coalgenerator, stack(Item.titanium, 10), stack(Item.dirium, 10)),
thermalgenerator(power, ProductionBlocks.thermalgenerator, stack(Item.titanium, 10), stack(Item.dirium, 10)),
combustiongenerator(power, ProductionBlocks.combustiongenerator, stack(Item.titanium, 10), stack(Item.dirium, 10)),
rtgenerator(power, ProductionBlocks.rtgenerator, stack(Item.titanium, 10), stack(Item.dirium, 10)),
nuclearreactor(power, ProductionBlocks.nuclearReactor, stack(Item.titanium, 10), stack(Item.dirium, 10)),
powerbooster(power, DistributionBlocks.powerbooster, stack(Item.titanium, 10), stack(Item.dirium, 10)),
powerlaser(power, DistributionBlocks.powerlaser, stack(Item.titanium, 10), stack(Item.dirium, 10)),
powerlaserrouter(power, DistributionBlocks.powerlaserrouter, stack(Item.titanium, 10), stack(Item.dirium, 10)),
coalgenerator(power, ProductionBlocks.coalgenerator, stack(Item.iron, 30), stack(Item.stone, 20)),
thermalgenerator(power, ProductionBlocks.thermalgenerator, stack(Item.steel, 30), stack(Item.iron, 30)),
combustiongenerator(power, ProductionBlocks.combustiongenerator, stack(Item.iron, 30), stack(Item.stone, 20)),
rtgenerator(power, ProductionBlocks.rtgenerator, stack(Item.titanium, 20), stack(Item.steel, 20)),
nuclearreactor(power, ProductionBlocks.nuclearReactor, stack(Item.titanium, 40), stack(Item.dirium, 40), stack(Item.steel, 50)),
powerbooster(power, DistributionBlocks.powerbooster, stack(Item.steel, 8), stack(Item.iron, 8)),
powerlaser(power, DistributionBlocks.powerlaser, stack(Item.steel, 3), stack(Item.iron, 3)),
powerlaserrouter(power, DistributionBlocks.powerlaserrouter, stack(Item.steel, 5), stack(Item.iron, 5)),
shieldgenerator(power, DefenseBlocks.shieldgenerator, stack(Item.titanium, 10), stack(Item.dirium, 10)),
shieldgenerator(power, DefenseBlocks.shieldgenerator, stack(Item.titanium, 30), stack(Item.dirium, 40)),
teleporter(distribution, DistributionBlocks.teleporter, stack(Item.titanium, 10), stack(Item.dirium, 10)),
teleporter(distribution, DistributionBlocks.teleporter, stack(Item.steel, 20), stack(Item.dirium, 15)),
healturret(power, DefenseBlocks.repairturret, stack(Item.iron, 30)),
megahealturret(power, DefenseBlocks.megarepairturret, stack(Item.iron, 20), stack(Item.steel, 30)),

View File

@ -52,7 +52,7 @@ public class LoadDialog extends FloatingDialog{
for(int i = 0; i < Vars.saveSlots; i++){
final int slot = i;
TextButton button = new TextButton("[orange]Slot " + (i + 1));
TextButton button = new TextButton("[accent]Slot " + (i + 1));
button.pad(Unit.dp.inPixels(12));
button.getLabelCell().top().left().growX();

View File

@ -86,11 +86,11 @@ public class Generator{
floor = Blocks.coal;
}
if(Noise.nnoise(x + 9999, y + 9999, 8, 1) > 0.253){
if(Noise.nnoise(x + 9999, y + 9999, 8, 1) > 0.264){
floor = Blocks.titanium;
}
if(Noise.nnoise(x + 99999, y + 99999, 7, 1) > 0.258){
if(Noise.nnoise(x + 99999, y + 99999, 7, 1) > 0.259){
floor = Blocks.uranium;
}
}
@ -112,7 +112,7 @@ public class Generator{
}
if(color == Hue.rgb(Color.PURPLE)){
if(!Vars.android) new TargetEnemy(0).set(x * Vars.tilesize, y * Vars.tilesize).add();
if(!Vars.android) new TargetEnemy().set(x * Vars.tilesize, y * Vars.tilesize).add();
floor = Blocks.stone;
}

View File

@ -151,6 +151,7 @@ public class ProductionBlocks{
stonedrill = new Drill("stonedrill"){{
resource = Blocks.stone;
result = Item.stone;
time = 4;
formalName = "stone drill";
description = "Mines 1 "+resource.name+" every "+time+" seconds.";
fullDescription = "The essential drill. When placed on stone tiles, outputs stone at a slow pace indefinitely.";

View File

@ -74,8 +74,8 @@ public class WeaponBlocks{
bullet = BulletType.iron;
ammo = Item.iron;
health = 70;
shots = 7;
inaccuracy = 30f;
shots = 5;
inaccuracy = 15f;
shotDelayScale = 0.7f;
fullDescription = "A standard turret. Uses iron for ammo. Shoots a spread of 7 bullets. "
+ "Lower range, but higher damage output than the gattling turret.";

View File

@ -11,7 +11,7 @@ public class Wall extends Block{
}
public boolean canReplace(Block other){
return other instanceof Wall;
return other instanceof Wall && health > other.health;
}
}

View File

@ -228,6 +228,7 @@ public class Turret extends Block{
bullet(tile, entity.rotation + Mathf.range(inaccuracy));
}else{
Timers.run(i * shotDelayScale, ()->{
Angles.translation(entity.rotation, width * Vars.tilesize / 2f);
bullet(tile, entity.rotation + Mathf.range(inaccuracy));
});
}

View File

@ -33,7 +33,7 @@ public class Drill extends Block{
@Override
public void update(Tile tile){
if(tile.floor() == resource && Timers.get(tile, "drill", 60 * time) && tile.entity.totalItems() < capacity){
if((tile.floor() == resource || (resource.drops.equals(tile.floor().drops))) && Timers.get(tile, "drill", 60 * time) && tile.entity.totalItems() < capacity){
offloadNear(tile, result);
Effects.effect(Fx.spark, tile.worldx(), tile.worldy());
}
@ -45,7 +45,7 @@ public class Drill extends Block{
@Override
public void drawOver(Tile tile){
if(tile.floor() != resource && resource != null){
if(tile.floor() != resource && !(resource.drops.equals(tile.floor().drops)) && resource != null){
Draw.colorl(0.85f + Mathf.absin(Timers.time(), 6f, 0.15f));
Draw.rect("cross", tile.worldx(), tile.worldy());
Draw.color();

View File

@ -58,7 +58,7 @@ public class Generator extends PowerBlock{
Effects.effect(Fx.shockwave, x, y);
Timers.run(12f + Mathf.random(20f), () -> {
tile.damageNearby(3, 40, 0f);
tile.damageNearby(4, 40, 0f);
});
Effects.sound(explosionSound, x, y);

Binary file not shown.

Binary file not shown.

Binary file not shown.