Overflow duct

This commit is contained in:
Anuken
2021-11-18 14:47:33 -05:00
parent 6026beb397
commit 275f6eb32f
10 changed files with 174 additions and 5 deletions

View File

@@ -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

View File

@@ -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){

View File

@@ -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;

View File

@@ -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<BuildPlan> 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();
}
}
}