Balanced multiple generators, bugfixes, made some turrets use power

This commit is contained in:
Anuken
2017-11-07 12:28:33 -05:00
parent 7e3e34ffe1
commit 01f5fccf96
23 changed files with 353 additions and 203 deletions

View File

@@ -79,7 +79,7 @@ project(":core") {
apply plugin: "java" apply plugin: "java"
dependencies { dependencies {
compile 'com.github.anuken:ucore:2d86b0497e' compile 'com.github.anuken:ucore:91e4e11010'
compile "com.badlogicgames.gdx:gdx:$gdxVersion" compile "com.badlogicgames.gdx:gdx:$gdxVersion"
compile "com.badlogicgames.gdx:gdx-ai:1.8.1" compile "com.badlogicgames.gdx:gdx-ai:1.8.1"
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 B

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 44 KiB

View File

@@ -15,7 +15,7 @@ import io.anuke.ucore.util.Angles;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
public class EMP extends TimedEntity{ public class EMP extends TimedEntity{
static final int maxTargets = 8; static final int maxTargets = 10;
static Array<Tile> array = new Array<>(); static Array<Tile> array = new Array<>();
int radius = 4; int radius = 4;
@@ -53,6 +53,7 @@ public class EMP extends TimedEntity{
if(tile.block() instanceof PowerAcceptor){ if(tile.block() instanceof PowerAcceptor){
PowerAcceptor p = (PowerAcceptor)tile.block(); PowerAcceptor p = (PowerAcceptor)tile.block();
tile.entity.damage(damage*2); //extra damage
p.setPower(tile, 0f); p.setPower(tile, 0f);
} }

View File

@@ -39,7 +39,7 @@ public class TeslaOrb extends Entity{
if(Mathf.chance(stopchance)){ if(Mathf.chance(stopchance)){
break; break;
} }
Array<SolidEntity> enemies = Entities.getNearby(curx, cury, range); Array<SolidEntity> enemies = Entities.getNearby(curx, cury, range*2f);
for(SolidEntity entity : enemies){ for(SolidEntity entity : enemies){
if(entity instanceof Enemy && entity.distanceTo(curx, cury) < range if(entity instanceof Enemy && entity.distanceTo(curx, cury) < range

View File

@@ -1,7 +1,9 @@
package io.anuke.mindustry.entities.enemies; package io.anuke.mindustry.entities.enemies;
import io.anuke.mindustry.Vars;
import io.anuke.mindustry.entities.Bullet; import io.anuke.mindustry.entities.Bullet;
import io.anuke.mindustry.entities.BulletType; import io.anuke.mindustry.entities.BulletType;
import io.anuke.mindustry.entities.TileEntity;
public class BlastEnemy extends Enemy{ public class BlastEnemy extends Enemy{
@@ -17,7 +19,13 @@ public class BlastEnemy extends Enemy{
void move(){ void move(){
super.move(); super.move();
if(target != null && target.distanceTo(this) < 10f){ float range = 10f;
if(target instanceof TileEntity){
TileEntity e = (TileEntity)target;
range = (e.tile.block().width * Vars.tilesize) /2f + 6f;
}
if(target != null && target.distanceTo(this) < range){
Bullet b = new Bullet(BulletType.blast, this, x, y, 0).add(); Bullet b = new Bullet(BulletType.blast, this, x, y, 0).add();
b.damage = BulletType.blast.damage + (tier-1) * 40; b.damage = BulletType.blast.damage + (tier-1) * 40;
damage(999); damage(999);

View File

@@ -101,7 +101,7 @@ public class Enemy extends DestructibleEntity{
int cindex = -1; int cindex = -1;
float dst = Float.MAX_VALUE; float dst = Float.MAX_VALUE;
//find closest node index
for(Tile tile : path){ for(Tile tile : path){
if(Vector2.dst(tile.worldx(), tile.worldy(), x, y) < dst){ if(Vector2.dst(tile.worldx(), tile.worldy(), x, y) < dst){
dst = Vector2.dst(tile.worldx(), tile.worldy(), x, y); dst = Vector2.dst(tile.worldx(), tile.worldy(), x, y);
@@ -111,11 +111,13 @@ public class Enemy extends DestructibleEntity{
index ++; index ++;
} }
//set node to that index
node = cindex; node = cindex;
int x2 = path[node].x, y2 = path[node].y; int x2 = path[node].x, y2 = path[node].y;
if(World.raycast(Mathf.scl2(x, Vars.tilesize), Mathf.scl2(y, Vars.tilesize), x2, y2) != null){ //if the enemy can move to that node right now, set its position to it
if(World.raycast(Mathf.scl2(x, Vars.tilesize), Mathf.scl2(y, Vars.tilesize), x2, y2) == null){
Timers.run(Mathf.random(15f), ()->{ Timers.run(Mathf.random(15f), ()->{
set(x2 * Vars.tilesize, y2 * Vars.tilesize); set(x2 * Vars.tilesize, y2 * Vars.tilesize);
}); });

View File

@@ -12,13 +12,12 @@ import io.anuke.ucore.graphics.Hue;
import io.anuke.ucore.util.Angles; import io.anuke.ucore.util.Angles;
public class HealerEnemy extends Enemy{ public class HealerEnemy extends Enemy{
int healTime = 14;
public HealerEnemy(int spawn) { public HealerEnemy(int spawn) {
super(spawn); super(spawn);
speed = 0.2f; speed = 0.2f;
reload = 30; reload = 14;
maxhealth = 130; maxhealth = 130;
range = 90f; range = 90f;
bullet = BulletType.shot; bullet = BulletType.shot;
@@ -48,7 +47,7 @@ public class HealerEnemy extends Enemy{
void updateShooting(){ void updateShooting(){
Enemy enemy = (Enemy)target; Enemy enemy = (Enemy)target;
if(enemy.health < enemy.maxhealth && Timers.get(this, "heal", healTime)){ if(enemy.health < enemy.maxhealth && Timers.get(this, "heal", reload)){
enemy.health ++; enemy.health ++;
} }
} }

View File

@@ -12,7 +12,7 @@ public class TitanEnemy extends Enemy{
speed = 0.1f; speed = 0.1f;
reload = 30; reload = 30;
maxhealth = 330; maxhealth = 400;
range = 80f; range = 80f;
bullet = BulletType.small; bullet = BulletType.small;
hitbox.setSize(7f); hitbox.setSize(7f);

View File

@@ -93,7 +93,10 @@ public class SaveIO{
TankEnemy.class, TankEnemy.class,
BlastEnemy.class, BlastEnemy.class,
MortarEnemy.class, MortarEnemy.class,
TestEnemy.class TestEnemy.class,
HealerEnemy.class,
TitanEnemy.class,
EmpEnemy.class
); );
private static final ObjectMap<Class<? extends Enemy>, Byte> idEnemies = new ObjectMap<Class<? extends Enemy>, Byte>(){{ private static final ObjectMap<Class<? extends Enemy>, Byte> idEnemies = new ObjectMap<Class<? extends Enemy>, Byte>(){{

View File

@@ -362,6 +362,10 @@ public class World{
for(int ry = -rad; ry <= rad; ry ++){ for(int ry = -rad; ry <= rad; ry ++){
Tile other = tile(rx+tilex, ry+tiley); Tile other = tile(rx+tilex, ry+tiley);
if(other != null && other.getLinked() != null){
other = other.getLinked();
}
if(other == null || other.entity == null ||(tile != null && other.entity == tile.entity)) continue; if(other == null || other.entity == null ||(tile != null && other.entity == tile.entity)) continue;
TileEntity e = other.entity; TileEntity e = other.entity;

View File

@@ -185,13 +185,18 @@ public class ProductionBlocks{
generateAmount = 4f; generateAmount = 4f;
powerCapacity = 40f; powerCapacity = 40f;
} }
@Override
public String description(){
return "Generates power from coal.";
}
}, },
thermalgenerator = new LiquidPowerGenerator("thermalgenerator"){ thermalgenerator = new LiquidPowerGenerator("thermalgenerator"){
{ {
formalName = "thermal generator"; formalName = "thermal generator";
//TODO //TODO
generateLiquid = Liquid.lava; generateLiquid = Liquid.lava;
inputLiquid = 2f; inputLiquid = 5f;
generatePower = 1f; generatePower = 1f;
powerCapacity = 40f; powerCapacity = 40f;
} }
@@ -206,7 +211,7 @@ public class ProductionBlocks{
formalName = "combustion generator"; formalName = "combustion generator";
//TODO //TODO
generateLiquid = Liquid.oil; generateLiquid = Liquid.oil;
inputLiquid = 2f; inputLiquid = 8f;
generatePower = 1f; generatePower = 1f;
powerCapacity = 40f; powerCapacity = 40f;
} }

View File

@@ -9,6 +9,7 @@ import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.defense.LaserTurret; import io.anuke.mindustry.world.blocks.types.defense.LaserTurret;
import io.anuke.mindustry.world.blocks.types.defense.PowerTurret;
import io.anuke.mindustry.world.blocks.types.defense.Turret; import io.anuke.mindustry.world.blocks.types.defense.Turret;
import io.anuke.ucore.core.Timers; import io.anuke.ucore.core.Timers;
import io.anuke.ucore.util.Angles; import io.anuke.ucore.util.Angles;
@@ -118,21 +119,18 @@ public class WeaponBlocks{
}, },
laserturret = new LaserTurret("laserturret"){ laserturret = new LaserTurret("laserturret"){
{ {
beamColor = Color.SKY; beamColor = Color.SKY;
formalName = "laser turret"; formalName = "laser turret";
range = 60; range = 60;
reload = 4f; reload = 4f;
damage = 10; damage = 10;
ammo = Item.coal;
health = 110; health = 110;
ammoMultiplier = 60; powerUsed = 0.2f;
} }
}, },
teslaturret = new Turret("waveturret"){ teslaturret = new PowerTurret("waveturret"){
{ {
formalName = "tesla turret"; formalName = "tesla turret";
range = 70; range = 70;
@@ -148,7 +146,7 @@ public class WeaponBlocks{
Angles.translation(entity.rotation, 4); Angles.translation(entity.rotation, 4);
new TeslaOrb(tile.worldx() + Angles.x(), tile.worldy() + Angles.y(), new TeslaOrb(tile.worldx() + Angles.x(), tile.worldy() + Angles.y(),
70, (int)(9*Vars.multiplier)).add(); range, (int)(9*Vars.multiplier)).add();
} }
}, },

View File

@@ -12,7 +12,7 @@ import io.anuke.ucore.util.Angles;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Tmp; import io.anuke.ucore.util.Tmp;
public class LaserTurret extends Turret{ public class LaserTurret extends PowerTurret{
protected Color beamColor = Color.WHITE.cpy(); protected Color beamColor = Color.WHITE.cpy();
protected String hiteffect = "laserhit"; protected String hiteffect = "laserhit";
protected int damage = 4; protected int damage = 4;

View File

@@ -0,0 +1,103 @@
package io.anuke.mindustry.world.blocks.types.defense;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.math.Vector2;
import io.anuke.mindustry.Vars;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.PowerAcceptor;
import io.anuke.ucore.core.Draw;
import io.anuke.ucore.util.Mathf;
public class PowerTurret extends Turret implements PowerAcceptor{
public float powerCapacity = 20f;
public float powerUsed = 0.5f;
public PowerTurret(String name) {
super(name);
ammo = Item.stone;
}
@Override
public void drawPixelOverlay(Tile tile){
Vector2 offset = getPlaceOffset();
Draw.color("green");
Draw.dashcircle(tile.worldx() + offset.x, tile.worldy() + offset.y, range);
Draw.reset();
PowerTurretEntity entity = tile.entity();
float fract = (float)entity.power / powerCapacity;
if(fract > 0)
fract = Mathf.clamp(fract, 0.24f, 1f);
Vars.renderer.drawBar(Color.YELLOW, tile.worldx() + offset.x, tile.worldy() + 6 + offset.y, fract);
}
@Override
public boolean hasAmmo(Tile tile){
PowerTurretEntity entity = tile.entity();
return entity.power >= powerUsed;
}
@Override
public void consumeAmmo(Tile tile){
PowerTurretEntity entity = tile.entity();
entity.power -= powerUsed;
}
@Override
public boolean acceptItem(Item item, Tile dest, Tile source){
return false;
}
@Override
public boolean acceptsPower(Tile tile){
PowerTurretEntity entity = tile.entity();
return entity.power + 0.001f <= powerCapacity;
}
@Override
public float addPower(Tile tile, float amount){
PowerTurretEntity entity = tile.entity();
float canAccept = Math.min(powerCapacity - entity.power, amount);
entity.power += canAccept;
return canAccept;
}
@Override
public void setPower(Tile tile, float power){
PowerTurretEntity entity = tile.entity();
entity.power = power;
}
@Override
public TileEntity getEntity(){
return new PowerTurretEntity();
}
public static class PowerTurretEntity extends TurretEntity{
public float power;
@Override
public void write(DataOutputStream stream) throws IOException{
stream.writeFloat(power);
}
@Override
public void read(DataInputStream stream) throws IOException{
power = stream.readFloat();
}
}
}

View File

@@ -35,7 +35,7 @@ public class Turret extends Block{
protected int ammoMultiplier = 20; protected int ammoMultiplier = 20;
protected int maxammo = 400; protected int maxammo = 400;
protected float rotatespeed = 0.2f; protected float rotatespeed = 0.2f;
protected float shootCone = 2f; protected float shootCone = 5f;
public Turret(String name) { public Turret(String name) {
super(name); super(name);
@@ -112,7 +112,7 @@ public class Turret extends Block{
if(entity.target != null && entity.target.isDead()) if(entity.target != null && entity.target.isDead())
entity.target = null; entity.target = null;
if(entity.ammo > 0){ if(hasAmmo(tile)){
if(Timers.get(entity, "target", targetInterval)){ if(Timers.get(entity, "target", targetInterval)){
entity.target = (Enemy)Entities.getClosest(tile.worldx(), tile.worldy(), range, e->{ entity.target = (Enemy)Entities.getClosest(tile.worldx(), tile.worldy(), range, e->{
@@ -132,12 +132,23 @@ public class Turret extends Block{
if(Angles.angleDist(entity.rotation, targetRot) < shootCone && Timers.get(tile, "reload", reload)){ if(Angles.angleDist(entity.rotation, targetRot) < shootCone && Timers.get(tile, "reload", reload)){
Effects.sound(shootsound, entity); Effects.sound(shootsound, entity);
shoot(tile); shoot(tile);
consumeAmmo(tile);
entity.ammo --; entity.ammo --;
} }
} }
} }
} }
public boolean hasAmmo(Tile tile){
TurretEntity entity = tile.entity();
return entity.ammo > 0;
}
public void consumeAmmo(Tile tile){
TurretEntity entity = tile.entity();
entity.ammo --;
}
@Override @Override
public TileEntity getEntity(){ public TileEntity getEntity(){
return new TurretEntity(); return new TurretEntity();

View File

@@ -22,13 +22,12 @@ public class Generator extends PowerBlock{
public int laserRange = 6; public int laserRange = 6;
public int laserDirections = 4; public int laserDirections = 4;
public int powerRange = 4; public int powerRange = 4;
public float powerSpeed = 0.03f; public float powerSpeed = 0.06f;
public boolean explosive = true; public boolean explosive = true;
public boolean drawRadius = false; public boolean drawRadius = false;
public Generator(String name) { public Generator(String name) {
super(name); super(name);
explosionEffect = "generatorexplosion";
} }
@Override @Override
@@ -41,7 +40,7 @@ public class Generator extends PowerBlock{
Timers.run(Mathf.random(8f + Mathf.random(6f)), () -> { Timers.run(Mathf.random(8f + Mathf.random(6f)), () -> {
Effects.shake(6f, 8f, x, y); Effects.shake(6f, 8f, x, y);
Effects.effect(explosionEffect, x, y); Effects.effect("generatorexplosion", x, y);
Effects.effect("shockwave", x, y); Effects.effect("shockwave", x, y);
Timers.run(12f + Mathf.random(20f), () -> { Timers.run(12f + Mathf.random(20f), () -> {
@@ -130,7 +129,10 @@ public class Generator extends PowerBlock{
Tile other = World.tile(tile.x + i * point.x, tile.y + i * point.y); Tile other = World.tile(tile.x + i * point.x, tile.y + i * point.y);
if(other != null && other.block() instanceof PowerAcceptor){ if(other != null && other.block() instanceof PowerAcceptor){
return other; Tile linked = other.getLinked();
if(linked == null || linked instanceof PowerAcceptor){
return other;
}
} }
} }
return null; return null;

View File

@@ -20,7 +20,7 @@ public class LiquidPowerGenerator extends Generator implements LiquidAcceptor{
/**Power to generate per generateInput.*/ /**Power to generate per generateInput.*/
public float generatePower = 1f; public float generatePower = 1f;
/**How much liquid to consume to get one generatePower.*/ /**How much liquid to consume to get one generatePower.*/
public float inputLiquid = 1f; public float inputLiquid = 5f;
public float liquidCapacity = 30f; public float liquidCapacity = 30f;
public String generateEffect = "generate"; public String generateEffect = "generate";

Binary file not shown.

Binary file not shown.

Binary file not shown.