diff --git a/src/biotech/world/blocks/production/BoostableDrill.java b/src/biotech/world/blocks/production/BoostableDrill.java index 2e41e33..7a89996 100644 --- a/src/biotech/world/blocks/production/BoostableDrill.java +++ b/src/biotech/world/blocks/production/BoostableDrill.java @@ -2,7 +2,9 @@ import arc.math.Mathf; import arc.math.geom.Point2; +import arc.struct.*; import arc.util.Log; +import biotech.world.blocks.production.DrillUpgrader.*; import mindustry.game.Team; import mindustry.gen.Building; import mindustry.type.Item; @@ -37,23 +39,68 @@ public int checkBooster(Tile tile) { if (tile.build == null) continue; if (tile.build.tile.nearby(edge).build == null) continue; if (tile.build.tile.nearby(edge).build instanceof DrillUpgrader.DrillUpgraderBuild build) { - if (build.canBoost()) boost = build.boost; + boost = build.boost; } } return boost; } public class BoostableDrillBuild extends DrillBuild { + public Seq linked = new Seq<>(); public int lastChange = -2; + public void updateOreCount(){ + countOre(tile); + dominantItem = returnItem; + dominantItems = returnCount; + } + + public void updateModules(DrillUpgraderBuild build){ + linked.addUnique(build); + updateOreCount(); + } + + public void removeModule(DrillUpgraderBuild build){ + linked.remove(build); + updateOreCount(); + } + + public int highestTier(){ + if(linked.size <= 0) return 0; + linked.sort( f -> f.boost); + return linked.first().boost; + } + + + @Override + public float efficiencyScale(){ + return moduleEfficiency() ; + } + + public float moduleEfficiency(){ + if(linked.size <= 0) return 1f; + + float[] total = {0}; + for(DrillUpgraderBuild m : linked) total[0] += m.efficiency; + return total[0] / linked.size ; + } + + + @Override + public void placed(){ + super.placed(); + + countOre(tile); + } + @Override public void updateTile() { - super.updateTile(); if (lastChange != world.tileChanges) { lastChange = world.tileChanges; - countOre(tile); + updateOreCount(); } + super.updateTile(); } } } diff --git a/src/biotech/world/blocks/production/DrillUpgrader.java b/src/biotech/world/blocks/production/DrillUpgrader.java index 430b519..eaf4753 100644 --- a/src/biotech/world/blocks/production/DrillUpgrader.java +++ b/src/biotech/world/blocks/production/DrillUpgrader.java @@ -2,16 +2,19 @@ import arc.graphics.g2d.Draw; import arc.graphics.g2d.TextureRegion; +import arc.math.geom.*; import arc.struct.EnumSet; import arc.util.Log; +import biotech.world.blocks.production.BoostableDrill.*; import mindustry.gen.Building; import mindustry.graphics.Drawf; -import mindustry.world.Block; -import mindustry.world.Tile; +import mindustry.world.*; import mindustry.world.blocks.power.PowerBlock; import mindustry.world.meta.BlockFlag; import mindustry.world.meta.Env; +import static mindustry.Vars.world; + public class DrillUpgrader extends Block { public DrillUpgrader(String name) { @@ -30,11 +33,54 @@ public DrillUpgrader(String name) { } public static class DrillUpgraderBuild extends Building { + public int lastChange = -2; public int boost = 1; - public boolean canBoost() { - return power.status == 1.0f; + @Override + public void placed() { + super.placed(); + + updateLinks(); + } + + @Override + public void onProximityUpdate(){ + super.onProximityUpdate(); + + updateLinks(); + } + + public void updateLinks(){ + for (Point2 edge : Edges.getEdges(block.size)) { + if (tile.build == null) continue; + if (tile.build.tile.nearby(edge).build == null) continue; + if(tile.build.tile.nearby(edge).build instanceof BoostableDrillBuild b){ + b.updateModules(this); + } + } } + + @Override + public void onRemoved(){ + super.onRemoved(); + + for (Point2 edge : Edges.getEdges(block.size)) { + if (tile.build == null) continue; + if (tile.build.tile.nearby(edge).build == null) continue; + if(tile.build.tile.nearby(edge).build instanceof BoostableDrillBuild b){ + b.removeModule(this); + } + } + } + + @Override + public void updateTile() { + if (lastChange != world.tileChanges) { + lastChange = world.tileChanges; + updateLinks(); + } + } + } }