Improved generator distribution and shield block
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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){
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user