Phase matter shield boost
This commit is contained in:
@@ -29,11 +29,15 @@ import java.io.*;
|
|||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
|
|
||||||
public class ForceProjector extends Block {
|
public class ForceProjector extends Block {
|
||||||
|
protected int timerUse = timers ++;
|
||||||
|
protected float phaseUseTime = 250f;
|
||||||
|
|
||||||
|
protected float phaseRadiusBoost = 60f;
|
||||||
protected float radius = 100f;
|
protected float radius = 100f;
|
||||||
protected float breakage = 500f;
|
protected float breakage = 550f;
|
||||||
protected float cooldownNormal = 1.5f;
|
protected float cooldownNormal = 1.75f;
|
||||||
protected float cooldownLiquid = 1.5f;
|
protected float cooldownLiquid = 1.5f;
|
||||||
protected float cooldownBrokenBase = 0.3f;
|
protected float cooldownBrokenBase = 0.35f;
|
||||||
protected float powerDamage = 0.1f;
|
protected float powerDamage = 0.1f;
|
||||||
protected TextureRegion topRegion;
|
protected TextureRegion topRegion;
|
||||||
|
|
||||||
@@ -45,6 +49,8 @@ public class ForceProjector extends Block {
|
|||||||
canOverdrive = false;
|
canOverdrive = false;
|
||||||
hasLiquids = true;
|
hasLiquids = true;
|
||||||
powerCapacity = 60f;
|
powerCapacity = 60f;
|
||||||
|
hasItems = true;
|
||||||
|
itemCapacity = 10;
|
||||||
consumes.add(new ConsumeLiquidFilter(liquid -> liquid.temperature <= 0.5f && liquid.flammability < 0.1f, 0.1f)).optional(true).update(false);
|
consumes.add(new ConsumeLiquidFilter(liquid -> liquid.temperature <= 0.5f && liquid.flammability < 0.1f, 0.1f)).optional(true).update(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,6 +76,12 @@ public class ForceProjector extends Block {
|
|||||||
entity.shield.add();
|
entity.shield.add();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
entity.phaseHeat = Mathf.lerpDelta(entity.phaseHeat, (float)entity.items.get(consumes.item()) / itemCapacity, 0.1f);
|
||||||
|
|
||||||
|
if(!entity.broken && entity.timer.get(timerUse, phaseUseTime) && entity.items.total() > 0){
|
||||||
|
entity.items.remove(consumes.item(), 1);
|
||||||
|
}
|
||||||
|
|
||||||
entity.radscl = Mathf.lerpDelta(entity.radscl, entity.broken ? 0f : 1f, 0.05f);
|
entity.radscl = Mathf.lerpDelta(entity.radscl, entity.broken ? 0f : 1f, 0.05f);
|
||||||
|
|
||||||
if(Mathf.chance(Timers.delta() * entity.buildup / breakage * 0.1f)){
|
if(Mathf.chance(Timers.delta() * entity.buildup / breakage * 0.1f)){
|
||||||
@@ -111,9 +123,11 @@ public class ForceProjector extends Block {
|
|||||||
entity.hit -= 1f/5f * Timers.delta();
|
entity.hit -= 1f/5f * Timers.delta();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float realRadius = realRadius(entity);
|
||||||
|
|
||||||
if(!entity.broken){
|
if(!entity.broken){
|
||||||
EntityPhysics.getNearby(bulletGroup, tile.drawx(), tile.drawy(), radius * entity.radscl*2f, bullet -> {
|
EntityPhysics.getNearby(bulletGroup, tile.drawx(), tile.drawy(), realRadius*2f, bullet -> {
|
||||||
if(bullet instanceof Bullet && ((Bullet) bullet).getTeam() != tile.getTeam() && isInsideHexagon(bullet.getX(), bullet.getY(), radius * 2f * entity.radscl, tile.drawx(), tile.drawy())){
|
if(bullet instanceof Bullet && ((Bullet) bullet).getTeam() != tile.getTeam() && isInsideHexagon(bullet.getX(), bullet.getY(), realRadius * 2f, tile.drawx(), tile.drawy())){
|
||||||
((Bullet) bullet).absorb();
|
((Bullet) bullet).absorb();
|
||||||
Effects.effect(BulletFx.absorb, bullet);
|
Effects.effect(BulletFx.absorb, bullet);
|
||||||
float hit = ((Bullet) bullet).getDamage()*powerDamage;
|
float hit = ((Bullet) bullet).getDamage()*powerDamage;
|
||||||
@@ -125,6 +139,10 @@ public class ForceProjector extends Block {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float realRadius(ForceEntity entity){
|
||||||
|
return (radius+entity.phaseHeat*phaseRadiusBoost) * entity.radscl;
|
||||||
|
}
|
||||||
|
|
||||||
boolean isInsideHexagon(float x0, float y0, float d, float x, float y) {
|
boolean isInsideHexagon(float x0, float y0, float d, float x, float y) {
|
||||||
float dx = Math.abs(x - x0)/d;
|
float dx = Math.abs(x - x0)/d;
|
||||||
float dy = Math.abs(y - y0)/d;
|
float dy = Math.abs(y - y0)/d;
|
||||||
@@ -160,6 +178,7 @@ public class ForceProjector extends Block {
|
|||||||
float radscl = 0f;
|
float radscl = 0f;
|
||||||
float hit;
|
float hit;
|
||||||
float warmup;
|
float warmup;
|
||||||
|
float phaseHeat;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void write(DataOutputStream stream) throws IOException{
|
public void write(DataOutputStream stream) throws IOException{
|
||||||
@@ -167,6 +186,7 @@ public class ForceProjector extends Block {
|
|||||||
stream.writeFloat(buildup);
|
stream.writeFloat(buildup);
|
||||||
stream.writeFloat(radscl);
|
stream.writeFloat(radscl);
|
||||||
stream.writeFloat(warmup);
|
stream.writeFloat(warmup);
|
||||||
|
stream.writeFloat(phaseHeat);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -175,6 +195,7 @@ public class ForceProjector extends Block {
|
|||||||
buildup = stream.readFloat();
|
buildup = stream.readFloat();
|
||||||
radscl = stream.readFloat();
|
radscl = stream.readFloat();
|
||||||
warmup = stream.readFloat();
|
warmup = stream.readFloat();
|
||||||
|
phaseHeat = stream.readFloat();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -195,13 +216,13 @@ public class ForceProjector extends Block {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public float drawSize(){
|
public float drawSize(){
|
||||||
return radius*2f+2f*entity.radscl;
|
return realRadius(entity)*2f+2f;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void draw(){
|
public void draw(){
|
||||||
Draw.color(Palette.accent);
|
Draw.color(Palette.accent);
|
||||||
Fill.polyTri(x, y, 6, radius*entity.radscl);
|
Fill.polyTri(x, y, 6, realRadius(entity));
|
||||||
Draw.color();
|
Draw.color();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -210,7 +231,7 @@ public class ForceProjector extends Block {
|
|||||||
|
|
||||||
Draw.color(Color.WHITE);
|
Draw.color(Color.WHITE);
|
||||||
Draw.alpha(entity.hit);
|
Draw.alpha(entity.hit);
|
||||||
Fill.polyTri(x, y, 6, radius*entity.radscl);
|
Fill.polyTri(x, y, 6, realRadius(entity));
|
||||||
Draw.color();
|
Draw.color();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user