diff --git a/core/assets-raw/sprites/blocks/distribution/ducts/overflow-duct-top.png b/core/assets-raw/sprites/blocks/distribution/ducts/overflow-duct-top.png new file mode 100644 index 0000000000..7a6637d7a9 Binary files /dev/null and b/core/assets-raw/sprites/blocks/distribution/ducts/overflow-duct-top.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/ducts/overflow-duct.png b/core/assets-raw/sprites/blocks/distribution/ducts/overflow-duct.png new file mode 100644 index 0000000000..8bbb599c9a Binary files /dev/null and b/core/assets-raw/sprites/blocks/distribution/ducts/overflow-duct.png differ diff --git a/core/assets-raw/sprites/units/emanate.png b/core/assets-raw/sprites/units/emanate.png index 95fa1a83d8..f297430956 100644 Binary files a/core/assets-raw/sprites/units/emanate.png and b/core/assets-raw/sprites/units/emanate.png differ diff --git a/core/assets/icons/icons.properties b/core/assets/icons/icons.properties index 0f7352074c..660fea210b 100755 --- a/core/assets/icons/icons.properties +++ b/core/assets/icons/icons.properties @@ -447,3 +447,5 @@ 63259=oxidation-chamber|block-oxidation-chamber-ui 63258=surge-crucible|block-surge-crucible-ui 63257=emanate|unit-emanate-ui +63256=overflow-duct|block-overflow-duct-ui +63255=large-plasma-bore|block-large-plasma-bore-ui diff --git a/core/assets/logicids.dat b/core/assets/logicids.dat index e06c76e3d9..54817c3f97 100644 Binary files a/core/assets/logicids.dat and b/core/assets/logicids.dat differ diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index a271ef0b55..3e8c4a8f96 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -77,7 +77,7 @@ public class Blocks implements ContentList{ overflowGate, underflowGate, massDriver, //transport - alternate - duct, ductRouter, ductBridge, ductUnloader, + duct, ductRouter, overflowDuct, ductBridge, ductUnloader, surgeConveyor, surgeRouter, //liquid @@ -94,7 +94,7 @@ public class Blocks implements ContentList{ //production mechanicalDrill, pneumaticDrill, laserDrill, blastDrill, waterExtractor, oilExtractor, cultivator, - cliffCrusher, plasmaBore, impactDrill, + cliffCrusher, plasmaBore, largePlasmaBore, impactDrill, //storage coreShard, coreFoundation, coreNucleus, vault, container, unloader, @@ -1430,6 +1430,11 @@ public class Blocks implements ContentList{ speed = 4f; }}; + overflowDuct = new OverflowDuct("overflow-duct"){{ + requirements(Category.distribution, with(Items.graphite, 10)); + speed = 4f; + }}; + ductBridge = new DuctBridge("duct-bridge"){{ requirements(Category.distribution, with(Items.graphite, 20)); speed = 4f; @@ -1908,13 +1913,27 @@ public class Blocks implements ContentList{ }}; plasmaBore = new BeamDrill("plasma-bore"){{ - requirements(Category.production, with(Items.graphite, 20, Items.beryllium, 10, Items.lead, 20)); + requirements(Category.production, with(Items.graphite, 20, Items.beryllium, 10)); consumes.power(0.2f); + drillTime = 200f; tier = 4; size = 2; range = 2; }}; + //TODO awful name + largePlasmaBore = new BeamDrill("large-plasma-bore"){{ + //TODO requirements + //TODO require hydrogen? optional for all drills? + requirements(Category.production, with(Items.graphite, 30, Items.beryllium, 20, Items.carbide, 30)); + consumes.power(0.6f); + drillTime = 170f; + tier = 5; + size = 3; + range = 6; + laserWidth = 0.7f; + }}; + //endregion //region storage diff --git a/core/src/mindustry/entities/comp/BlockUnitComp.java b/core/src/mindustry/entities/comp/BlockUnitComp.java index 39adf5c891..a01be90c4f 100644 --- a/core/src/mindustry/entities/comp/BlockUnitComp.java +++ b/core/src/mindustry/entities/comp/BlockUnitComp.java @@ -23,6 +23,13 @@ abstract class BlockUnitComp implements Unitc{ set(tile); } + @Override + public void add(){ + if(tile == null){ + throw new RuntimeException("Do not add BlockUnit entities to the game, they will simply crash. Internal use only."); + } + } + @Override public void update(){ if(tile != null){ diff --git a/core/src/mindustry/world/blocks/distribution/DuctRouter.java b/core/src/mindustry/world/blocks/distribution/DuctRouter.java index b04f75afbe..0e2b7be04f 100644 --- a/core/src/mindustry/world/blocks/distribution/DuctRouter.java +++ b/core/src/mindustry/world/blocks/distribution/DuctRouter.java @@ -27,7 +27,6 @@ public class DuctRouter extends Block{ update = true; solid = false; hasItems = true; - conveyorPlacement = true; unloadable = false; itemCapacity = 1; noUpdateDisabled = true; @@ -58,6 +57,11 @@ public class DuctRouter extends Block{ Draw.rect(topRegion, plan.drawx(), plan.drawy(), plan.rotation * 90); } + @Override + public boolean rotatedOutput(int x, int y){ + return false; + } + public class DuctRouterBuild extends Building{ public @Nullable Item sortItem; diff --git a/core/src/mindustry/world/blocks/distribution/OverflowDuct.java b/core/src/mindustry/world/blocks/distribution/OverflowDuct.java new file mode 100644 index 0000000000..b59dc5c7b9 --- /dev/null +++ b/core/src/mindustry/world/blocks/distribution/OverflowDuct.java @@ -0,0 +1,137 @@ +package mindustry.world.blocks.distribution; + +import arc.graphics.g2d.*; +import arc.math.*; +import arc.util.*; +import mindustry.annotations.Annotations.*; +import mindustry.entities.units.*; +import mindustry.gen.*; +import mindustry.type.*; +import mindustry.world.*; +import mindustry.world.meta.*; + +public class OverflowDuct extends Block{ + public float speed = 5f; + + public @Load(value = "@-top") TextureRegion topRegion; + + public OverflowDuct(String name){ + super(name); + + group = BlockGroup.transportation; + update = true; + solid = false; + hasItems = true; + conveyorPlacement = true; + unloadable = false; + itemCapacity = 1; + noUpdateDisabled = true; + rotate = true; + envEnabled = Env.space | Env.terrestrial | Env.underwater; + } + + @Override + public void setStats(){ + super.setStats(); + + stats.add(Stat.itemsMoved, 60f / speed, StatUnit.itemsSecond); + } + + @Override + public TextureRegion[] icons(){ + return new TextureRegion[]{region, topRegion}; + } + + @Override + public void drawRequestRegion(BuildPlan plan, Eachable list){ + Draw.rect(region, plan.drawx(), plan.drawy()); + Draw.rect(topRegion, plan.drawx(), plan.drawy(), plan.rotation * 90); + } + + @Override + public boolean rotatedOutput(int x, int y){ + return false; + } + + public class DuctRouterBuild extends Building{ + public float progress; + public @Nullable Item current; + + @Override + public void draw(){ + Draw.rect(region, x, y); + Draw.rect(topRegion, x, y, rotdeg()); + } + + @Override + public void updateTile(){ + progress += edelta() / speed * 2f; + + if(current != null){ + if(progress >= (1f - 1f/speed)){ + var target = target(); + if(target != null){ + target.handleItem(this, current); + cdump = (byte)(cdump == 0 ? 2 : 0); + items.remove(current, 1); + current = null; + progress %= (1f - 1f/speed); + } + } + }else{ + progress = 0; + } + + if(current == null && items.total() > 0){ + current = items.first(); + } + } + + @Nullable + public Building target(){ + if(current == null) return null; + + Building front = front(); + if(front != null && front.team == team && front.acceptItem(this, current)){ + return front; + } + + for(int i = -1; i <= 1; i++){ + int dir = Mathf.mod(rotation + (((i + cdump + 1) % 3) - 1), 4); + if(dir == rotation) continue; + Building other = nearby(dir); + if(other != null && other.team == team && other.acceptItem(this, current)){ + return other; + } + } + return null; + } + + @Override + public boolean acceptItem(Building source, Item item){ + return current == null && items.total() == 0 && + (Edges.getFacingEdge(source.tile(), tile).relativeTo(tile) == rotation); + } + + @Override + public int removeStack(Item item, int amount){ + int removed = super.removeStack(item, amount); + if(item == current) current = null; + return removed; + } + + @Override + public void handleStack(Item item, int amount, Teamc source){ + super.handleStack(item, amount, source); + current = item; + } + + @Override + public void handleItem(Building source, Item item){ + current = item; + progress = -1f; + items.add(item, 1); + noSleep(); + } + } +} diff --git a/gradle.properties b/gradle.properties index 47efdec8d7..8c9c4e6695 100644 --- a/gradle.properties +++ b/gradle.properties @@ -24,4 +24,4 @@ android.useAndroidX=true #used for slow jitpack builds; TODO see if this actually works org.gradle.internal.http.socketTimeout=100000 org.gradle.internal.http.connectionTimeout=100000 -archash=430f9146f3c9c34db1f9ad9a8784e71c322246f2 +archash=5952043ab3a6de8f254dd038ea7ac4cab1b8a852