Improved generator distribution and shield block

This commit is contained in:
Anuken
2017-10-26 18:44:29 -04:00
parent d2a678f0b8
commit de397a237b
11 changed files with 169 additions and 135 deletions

View File

@@ -14,6 +14,7 @@ import io.anuke.ucore.util.Mathf;
public class Shield extends Entity{
public boolean active;
private float uptime = 0f;
private final Tile tile;
//TODO
@@ -29,6 +30,15 @@ public class Shield extends Entity{
@Override
public void update(){
if(active){
uptime += Timers.delta() / 90f;
}else{
uptime -= Timers.delta() / 60f;
if(uptime < 0)
remove();
}
uptime = Mathf.clamp(uptime);
if(!(tile.block() instanceof ShieldBlock)){
remove();
return;
@@ -36,7 +46,7 @@ public class Shield extends Entity{
ShieldBlock block = (ShieldBlock)tile.block();
Entities.getNearby(x, y, block.shieldRadius * 2 + 10, entity->{
Entities.getNearby(x, y, block.shieldRadius * 2*uptime + 10, entity->{
if(entity instanceof BulletEntity){
BulletEntity bullet = (BulletEntity)entity;
@@ -58,6 +68,7 @@ public class Shield extends Entity{
ShieldBlock block = (ShieldBlock)tile.block();
float rad = block.shieldRadius*2 + Mathf.sin(Timers.time(), 25f, 2f);
rad *= uptime;
Graphics.surface("shield", false);
Draw.color(Color.ROYAL);
@@ -67,6 +78,10 @@ public class Shield extends Entity{
Graphics.surface();
}
public void removeDelay(){
active = false;
}
@Override
public void added(){
active = true;
@@ -75,5 +90,7 @@ public class Shield extends Entity{
@Override
public void removed(){
active = false;
uptime = 0f;
}
}

View File

@@ -7,10 +7,10 @@ import io.anuke.mindustry.world.blocks.types.PowerBlock;
import io.anuke.ucore.core.Timers;
public class ShieldBlock extends PowerBlock{
private static boolean debugShield = true;
private static boolean debugShield = false;
public float shieldRadius = 40f;
public float powerDrain = 0.01f;
public float powerDrain = 0.005f;
public ShieldBlock(String name) {
super(name);
@@ -34,7 +34,7 @@ public class ShieldBlock extends PowerBlock{
entity.power -= powerDrain * Timers.delta();
}else{
if(entity.shield.active && !debugShield){
entity.shield.remove();
entity.shield.removeDelay();
}
}

View File

@@ -10,6 +10,11 @@ public class PowerBooster extends Generator{
super(name);
}
@Override
public void update(Tile tile){
distributePower(tile);
}
@Override
public float addPower(Tile tile, float amount){
PowerEntity entity = tile.entity();

View File

@@ -8,57 +8,71 @@ import io.anuke.mindustry.world.World;
import io.anuke.mindustry.world.blocks.types.PowerAcceptor;
import io.anuke.mindustry.world.blocks.types.PowerBlock;
import io.anuke.ucore.core.Draw;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.util.Mathf;
public class Generator extends PowerBlock{
public static final int powerTime = 8;
public static final int powerTime = 2;
public int powerRange = 6;
public float powerSpeed = 0.15f;
public float powerSpeed = 0.2f;
public Generator(String name) {
super(name);
}
@Override
public void drawPixelOverlay(Tile tile){
super.drawPixelOverlay(tile);
Draw.color("yellow");
Draw.dashcircle(tile.worldx(), tile.worldy(), powerRange * Vars.tilesize);
Draw.reset();
}
protected void distributePower(Tile tile){
if(!Timers.get(tile, "generate", powerTime)){
return;
}
PowerEntity p = tile.entity();
int acceptors = 0;
float flow = 0f;
//TODO have two phases, where it checks nearby blocks first, then distributes it evenly
for(int x = -powerRange; x <= powerRange; x ++){
for(int y = -powerRange; y <= powerRange; y ++){
if(x == 0 && y == 0){
continue;
}
if(p.power <= 0.0001f){
return;
}
if(Vector2.dst(x, y, 0, 0) < powerRange){
Tile dest = World.tile(tile.x + x, tile.y + y);
if(dest != null && dest.block() instanceof PowerAcceptor){
PowerAcceptor block = (PowerAcceptor)dest.block();
float transmission = Math.min(powerSpeed, p.power);
if(p.power >= 0.0001f){
float amount = block.addPower(dest, transmission);
p.power -= amount;
for(int i = 0; i < 2; i++){
for(int x = -powerRange; x <= powerRange; x++){
for(int y = -powerRange; y <= powerRange; y++){
if(x == 0 && y == 0){
continue;
}
if(Vector2.dst(x, y, 0, 0) < powerRange){
Tile dest = World.tile(tile.x + x, tile.y + y);
if(dest != null && dest.block() instanceof PowerAcceptor){
if(i == 1){
PowerAcceptor block = (PowerAcceptor) dest.block();
float transmission = Math.min(flow, p.power);
float amount = block.addPower(dest, transmission);
p.power -= amount;
}else{
acceptors ++;
}
}
}
}
}
if(i == 0 && acceptors > 0){
flow = Mathf.clamp(powerSpeed / acceptors, 0f, p.power / acceptors);
}
}
}
//don't accept any power
@Override
public float addPower(Tile tile, float amount){

View File

@@ -7,7 +7,6 @@ import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Timers;
public class ItemPowerGenerator extends Generator{
public int itemCapacity = 20;
@@ -42,9 +41,8 @@ public class ItemPowerGenerator extends Generator{
entity.removeItem(generateItem, 1);
}
if(Timers.get(tile, "power", powerTime)){
distributePower(tile);
}
distributePower(tile);
}
}

View File

@@ -37,6 +37,7 @@ public class LiquidItemPowerGenerator extends LiquidPowerGenerator{
//TODO don't generate when full of energy
if(entity.liquidAmount >= inputLiquid && entity.hasItem(generateItem, itemInput)
&& entity.power + generatePower < powerCapacity
&& Timers.get(tile, "consume", generateTime)){
entity.liquidAmount -= inputLiquid;
entity.power += generatePower;
@@ -45,9 +46,8 @@ public class LiquidItemPowerGenerator extends LiquidPowerGenerator{
Effects.effect(generateEffect, tile.worldx() + offset.x, tile.worldy() + offset.y);
}
if(Timers.get(tile, "generate", generateTime)){
distributePower(tile);
}
distributePower(tile);
}
@Override

View File

@@ -49,7 +49,8 @@ public class LiquidPowerGenerator extends Generator implements LiquidAcceptor{
LiquidPowerEntity entity = tile.entity();
//TODO don't generate when full of energy
if(entity.liquidAmount >= inputLiquid && Timers.get(tile, "consume", generateTime)){
if(entity.liquidAmount >= inputLiquid && entity.power + generatePower < powerCapacity
&& Timers.get(tile, "consume", generateTime)){
entity.liquidAmount -= inputLiquid;
entity.power += generatePower;
@@ -57,9 +58,8 @@ public class LiquidPowerGenerator extends Generator implements LiquidAcceptor{
Effects.effect(generateEffect, tile.worldx() + offset.x, tile.worldy() + offset.y);
}
if(Timers.get(tile, "consume", generateTime)){
distributePower(tile);
}
distributePower(tile);
}
@Override