Compile error fix / Additional power transfer implementation

This commit is contained in:
Anuken 2018-09-13 08:32:55 -04:00
parent abd87793e4
commit bf57318307
13 changed files with 64 additions and 70 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 326 B

After

Width:  |  Height:  |  Size: 629 B

View File

@ -152,7 +152,7 @@ public class Block extends BaseBlock {
} }
} }
entity.power.graph = new PowerGraph(); entity.power.graph = new PowerGraph(entity);
entity.power.graph.add(tile); entity.power.graph.add(tile);
}else{ }else{
//TODO //TODO

View File

@ -366,11 +366,11 @@ public class Conveyor extends Block{
ConveyorEntity entity = tile.entity(); ConveyorEntity entity = tile.entity();
Array<Object> arr = super.getDebugInfo(tile); Array<Object> arr = super.getDebugInfo(tile);
arr.addAll(Array.with( arr.addAll(Array.with(
"mincarry", entity.minCarry, "mincarry", entity.minCarry,
"minitem", entity.minCarry, "minitem", entity.minCarry,
"carrying", entity.carrying, "carrying", entity.carrying,
"clogHeat", entity.clogHeat, "clogHeat", entity.clogHeat,
"sleeping", entity.isSleeping() "sleeping", entity.isSleeping()
)); ));
return arr; return arr;
} }

View File

@ -50,7 +50,7 @@ public class FusionReactor extends PowerGenerator{
entity.power.amount += powerAdded; entity.power.amount += powerAdded;
entity.totalProgress += entity.warmup * Timers.delta(); entity.totalProgress += entity.warmup * Timers.delta();
distributePower(tile); tile.entity.power.graph.update();
} }
@Override @Override

View File

@ -106,8 +106,7 @@ public abstract class ItemGenerator extends PowerGenerator{
entity.generateTime = 1f; entity.generateTime = 1f;
} }
distributePower(tile); tile.entity.power.graph.update();
} }
protected abstract float getItemEfficiency(Item item); protected abstract float getItemEfficiency(Item item);

View File

@ -77,7 +77,7 @@ public abstract class ItemLiquidGenerator extends ItemGenerator{
} }
} }
distributePower(tile); tile.entity.power.graph.update();
} }
@Override @Override

View File

@ -61,7 +61,7 @@ public abstract class LiquidGenerator extends PowerGenerator{
} }
} }
distributePower(tile); tile.entity.power.graph.update();
} }
@Override @Override

View File

@ -124,7 +124,7 @@ public class NuclearReactor extends PowerGenerator{
if(entity.heat >= 0.999f){ if(entity.heat >= 0.999f){
entity.kill(); entity.kill();
}else{ }else{
distributePower(tile); tile.entity.power.graph.update();
} }
} }

View File

@ -12,6 +12,6 @@ public class PowerDistributor extends PowerBlock{
@Override @Override
public void update(Tile tile){ public void update(Tile tile){
tile.entity.power.graph.distribute(tile); tile.entity.power.graph.update();
} }
} }

View File

@ -1,21 +1,67 @@
package io.anuke.mindustry.world.blocks.power; package io.anuke.mindustry.world.blocks.power;
import com.badlogic.gdx.utils.ObjectSet; import com.badlogic.gdx.utils.ObjectSet;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import static io.anuke.mindustry.Vars.threads;
public class PowerGraph{ public class PowerGraph{
private ObjectSet<Tile> producers = new ObjectSet<>(); private final ObjectSet<Tile> producers = new ObjectSet<>();
private ObjectSet<Tile> consumers = new ObjectSet<>(); private final ObjectSet<Tile> consumers = new ObjectSet<>();
private ObjectSet<Tile> all = new ObjectSet<>(); private final ObjectSet<Tile> all = new ObjectSet<>();
private final TileEntity seed;
public void distribute(Tile tile){ private long lastFrameUpdated;
public PowerGraph(TileEntity seed){
this.seed = seed;
}
public boolean isSeed(TileEntity entity){
return seed == entity;
}
public void update(){
if(threads.getFrameID() == lastFrameUpdated || consumers.size == 0 || producers.size == 0){
return;
}
lastFrameUpdated = threads.getFrameID();
for(Tile producer : producers){
float accumulator = producer.entity.power.amount;
float toEach = accumulator / consumers.size;
float outputs = 0f;
for(Tile tile : consumers){
outputs += Math.min(tile.block().powerCapacity - tile.entity.power.amount, toEach) / toEach;
}
float finalEach = toEach / outputs;
float buffer = 0f;
if(Float.isNaN(finalEach)){
return;
}
for(Tile tile : consumers){
float used = Math.min(tile.block().powerCapacity - tile.entity.power.amount, finalEach);
buffer += used;
tile.entity.power.amount += used;
}
producer.entity.power.amount -= buffer;
}
} }
public void add(Tile tile){ public void add(Tile tile){
all.add(tile); all.add(tile);
if(tile.block().outputsPower){ if(tile.block().outputsPower){
producers.add(tile); producers.add(tile);
}else{
consumers.add(tile);
} }
} }

View File

@ -110,7 +110,7 @@ public class PowerNode extends PowerBlock{
@Override @Override
public void update(Tile tile){ public void update(Tile tile){
distributeLaserPower(tile); tile.entity.power.graph.update();
} }
@Override @Override
@ -227,56 +227,6 @@ public class PowerNode extends PowerBlock{
return canAccept; return canAccept;
} }
protected boolean shouldDistribute(Tile tile, Tile other){
return other != null && other.entity != null && other.block().hasPower && other.getTeamID() == tile.getTeamID() && other.entity.power.amount / other.block().powerCapacity <= tile.entity.power.amount / powerCapacity &&
!(other.block() instanceof PowerGenerator); //do not distribute to power generators
}
protected boolean shouldLeechPower(Tile tile, Tile other){
return other.getTeamID() == tile.getTeamID() && !(other.block() instanceof PowerNode)
&& other.block() instanceof PowerDistributor //only suck power from batteries and power generators
&& other.entity.power.amount / other.block().powerCapacity > tile.entity.power.amount / powerCapacity;
}
protected void distributeLaserPower(Tile tile){
DistributorEntity entity = tile.entity();
if(Float.isNaN(entity.power.amount)){
entity.power.amount = 0f;
}
int targets = 0;
//validate everything first.
for(int i = 0; i < entity.links.size; i++){
Tile target = world.tile(entity.links.get(i));
if(!linkValid(tile, target)){
entity.links.removeIndex(i);
i--;
}else if(shouldDistribute(tile, target)){
targets++;
}
}
float result = Math.min(entity.power.amount / targets, powerSpeed * Timers.delta());
for(int i = 0; i < entity.links.size; i++){
Tile target = world.tile(entity.links.get(i));
if(targets > 0 && shouldDistribute(tile, target)){
float transmit = Math.min(result, entity.power.amount);
if(target.block().acceptPower(target, tile, transmit)){
entity.power.amount -= target.block().addPower(target, transmit);
}
}else if(shouldLeechPower(tile, target)){
float diff = (target.entity.power.amount / target.block().powerCapacity - tile.entity.power.amount / powerCapacity) / 1.4f;
float transmit = Math.min(Math.min(target.block().powerCapacity * diff, target.entity.power.amount), powerCapacity - tile.entity.power.amount);
entity.power.amount += transmit;
target.entity.power.amount -= transmit;
}
}
}
protected boolean linked(Tile tile, Tile other){ protected boolean linked(Tile tile, Tile other){
return tile.<DistributorEntity>entity().links.contains(other.packedPosition()); return tile.<DistributorEntity>entity().links.contains(other.packedPosition());
} }

View File

@ -28,7 +28,7 @@ public class SolarGenerator extends PowerGenerator{
public void update(Tile tile){ public void update(Tile tile){
addPower(tile, generation * Timers.delta()); addPower(tile, generation * Timers.delta());
distributePower(tile); tile.entity.power.graph.update();
} }
} }

View File

@ -22,7 +22,6 @@ public class PowerModule extends BlockModule{
} }
float canAccept = Math.min(capacity - amount, add); float canAccept = Math.min(capacity - amount, add);
amount += canAccept; amount += canAccept;
return canAccept; return canAccept;