From bf57318307d14c49796bf0fe2ae5dc711d6679f0 Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 13 Sep 2018 08:32:55 -0400 Subject: [PATCH] Compile error fix / Additional power transfer implementation --- .../sprites/blocks/power/battery-large.png | Bin 326 -> 629 bytes core/src/io/anuke/mindustry/world/Block.java | 2 +- .../world/blocks/distribution/Conveyor.java | 10 ++-- .../world/blocks/power/FusionReactor.java | 2 +- .../world/blocks/power/ItemGenerator.java | 3 +- .../blocks/power/ItemLiquidGenerator.java | 2 +- .../world/blocks/power/LiquidGenerator.java | 2 +- .../world/blocks/power/NuclearReactor.java | 2 +- .../world/blocks/power/PowerDistributor.java | 2 +- .../world/blocks/power/PowerGraph.java | 54 ++++++++++++++++-- .../world/blocks/power/PowerNode.java | 52 +---------------- .../world/blocks/power/SolarGenerator.java | 2 +- .../mindustry/world/modules/PowerModule.java | 1 - 13 files changed, 64 insertions(+), 70 deletions(-) diff --git a/core/assets-raw/sprites/blocks/power/battery-large.png b/core/assets-raw/sprites/blocks/power/battery-large.png index 08ed3aa464fb82427cb1574fb76d525690f818f3..74bce7fc5471af8e6bcbf4e97bf378e5f9d61336 100644 GIT binary patch delta 605 zcmV-j0;2uK0`&xtBYyw}VoOIv0Mr110BgUYtAPLj010qNS#tmY3ljhU3ljkVnw%H_ z000McNliru;t34^EG~`3%;W$70s=`yK~zY`wUx1N6EPIVe>u5Z1yiIPij)i&QF-f_ zp&JWgV2&71tOb;RfPbI^ovKRNkUBGjiiM>^M;3G{x*Jj{B7a#y-G~&1yLUPJY$Jwz z%h^8rz31X)=4W8_2|fmDl~5zUN4sQp2)>pDCs`< z&M14KnUBqHlYi$opMO=iT^jj;V{ZhyUIz~ITsdF}L1nZ#)x8~+SvV_M=6hssulP^5K2Z)hp!Kq4zzijo|x z7hOYH>il}-RFPmlnw0+!cHC;6)HJ!!q^MJTd9^JmI)4P<{^tV#-#f2)kzW~+3tjen zn#X*2_qfbKB@Ce`V$bNDzJ0%KQe@_!?|q@N&)(aTX;Ve6k{~qAN0a(+NL@h{?cPD@ zaK4(D2P>muyyly5U-+ zby7PK$yUnz+29(0uUUC(q0>&fvme+_{ujP8su@9Zlh#RHpJe@Cb64q(eA*6mtx&hK rJEONB2!!V>E4<@SPf`0S5#r=8Q`QtcMy2tx00000NkvXXu0mjf4Qm<& delta 300 zcmV+{0n`5V1jYi8BYy!6NklNUj5Qh$Lp5EuGFEmY z^Ckc$)PTARNJ@PLz&NoLPclIwluExxi9P^U4XnebyF|;x#!-oI^;1zvTp%Hdx&Zzv zkym8hvK3z3k+j>?RtAZ&QJM1882? y-G4X{NaUBP+a-1e&?Yi0mMha|^90fjAdoi#yot|Dyu_FQ0000 arr = super.getDebugInfo(tile); arr.addAll(Array.with( - "mincarry", entity.minCarry, - "minitem", entity.minCarry, - "carrying", entity.carrying, - "clogHeat", entity.clogHeat, - "sleeping", entity.isSleeping() + "mincarry", entity.minCarry, + "minitem", entity.minCarry, + "carrying", entity.carrying, + "clogHeat", entity.clogHeat, + "sleeping", entity.isSleeping() )); return arr; } diff --git a/core/src/io/anuke/mindustry/world/blocks/power/FusionReactor.java b/core/src/io/anuke/mindustry/world/blocks/power/FusionReactor.java index d31f5a5ed7..0cc940c41c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/FusionReactor.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/FusionReactor.java @@ -50,7 +50,7 @@ public class FusionReactor extends PowerGenerator{ entity.power.amount += powerAdded; entity.totalProgress += entity.warmup * Timers.delta(); - distributePower(tile); + tile.entity.power.graph.update(); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/power/ItemGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/ItemGenerator.java index 0de68c738d..0a810d4d9c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/ItemGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/ItemGenerator.java @@ -106,8 +106,7 @@ public abstract class ItemGenerator extends PowerGenerator{ entity.generateTime = 1f; } - distributePower(tile); - + tile.entity.power.graph.update(); } protected abstract float getItemEfficiency(Item item); diff --git a/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java index 5df81813da..a4fd452e47 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java @@ -77,7 +77,7 @@ public abstract class ItemLiquidGenerator extends ItemGenerator{ } } - distributePower(tile); + tile.entity.power.graph.update(); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/power/LiquidGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/LiquidGenerator.java index d1a9e312e8..44b78bdd69 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/LiquidGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/LiquidGenerator.java @@ -61,7 +61,7 @@ public abstract class LiquidGenerator extends PowerGenerator{ } } - distributePower(tile); + tile.entity.power.graph.update(); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/power/NuclearReactor.java b/core/src/io/anuke/mindustry/world/blocks/power/NuclearReactor.java index 8c0e34c9ec..48bd304ef5 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/NuclearReactor.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/NuclearReactor.java @@ -124,7 +124,7 @@ public class NuclearReactor extends PowerGenerator{ if(entity.heat >= 0.999f){ entity.kill(); }else{ - distributePower(tile); + tile.entity.power.graph.update(); } } diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerDistributor.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerDistributor.java index e4b6836506..12354ac3da 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerDistributor.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerDistributor.java @@ -12,6 +12,6 @@ public class PowerDistributor extends PowerBlock{ @Override public void update(Tile tile){ - tile.entity.power.graph.distribute(tile); + tile.entity.power.graph.update(); } } diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java index 0390aa7679..a5f9588400 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java @@ -1,21 +1,67 @@ package io.anuke.mindustry.world.blocks.power; import com.badlogic.gdx.utils.ObjectSet; +import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.world.Tile; +import static io.anuke.mindustry.Vars.threads; + public class PowerGraph{ - private ObjectSet producers = new ObjectSet<>(); - private ObjectSet consumers = new ObjectSet<>(); - private ObjectSet all = new ObjectSet<>(); + private final ObjectSet producers = new ObjectSet<>(); + private final ObjectSet consumers = new ObjectSet<>(); + private final ObjectSet 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){ all.add(tile); if(tile.block().outputsPower){ producers.add(tile); + }else{ + consumers.add(tile); } } diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java index 3e66dbb588..5fbe158458 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java @@ -110,7 +110,7 @@ public class PowerNode extends PowerBlock{ @Override public void update(Tile tile){ - distributeLaserPower(tile); + tile.entity.power.graph.update(); } @Override @@ -227,56 +227,6 @@ public class PowerNode extends PowerBlock{ 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){ return tile.entity().links.contains(other.packedPosition()); } diff --git a/core/src/io/anuke/mindustry/world/blocks/power/SolarGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/SolarGenerator.java index 5dfe21ebf3..03e017e896 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/SolarGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/SolarGenerator.java @@ -28,7 +28,7 @@ public class SolarGenerator extends PowerGenerator{ public void update(Tile tile){ addPower(tile, generation * Timers.delta()); - distributePower(tile); + tile.entity.power.graph.update(); } } diff --git a/core/src/io/anuke/mindustry/world/modules/PowerModule.java b/core/src/io/anuke/mindustry/world/modules/PowerModule.java index 2647a442c1..b75a85fc76 100644 --- a/core/src/io/anuke/mindustry/world/modules/PowerModule.java +++ b/core/src/io/anuke/mindustry/world/modules/PowerModule.java @@ -22,7 +22,6 @@ public class PowerModule extends BlockModule{ } float canAccept = Math.min(capacity - amount, add); - amount += canAccept; return canAccept;