Fixed puddles not appearing / Overdrive tweaks

- Bridges, routers and junctions can (probably) be overdrived now, untested
This commit is contained in:
Anuken
2020-05-08 16:41:59 -04:00
parent bcec6261d1
commit aab97fefc8
18 changed files with 58 additions and 90 deletions

View File

@@ -63,7 +63,7 @@ public class Puddles{
p.lastRipple(Time.time()); p.lastRipple(Time.time());
} }
}else{ }else{
p.amount(p.amount() + reactPuddle(p.liquid(), liquid, amount, p.tile(), p.x(), p.y())); p.amount(p.amount() + reactPuddle(p.liquid(), liquid, amount, p.tile(), (p.x() + source.worldx())/2f, (p.y() + source.worldy())/2f));
} }
} }

View File

@@ -18,7 +18,7 @@ import static mindustry.entities.Puddles.maxLiquid;
@EntityDef(value = {Puddlec.class}, pooled = true) @EntityDef(value = {Puddlec.class}, pooled = true)
@Component @Component
abstract class PuddleComp implements Posc, Puddlec{ abstract class PuddleComp implements Posc, Puddlec, Drawc{
private static final int maxGeneration = 2; private static final int maxGeneration = 2;
private static final Color tmp = new Color(); private static final Color tmp = new Color();
private static final Rect rect = new Rect(); private static final Rect rect = new Rect();

View File

@@ -383,11 +383,11 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc, QuadTree
} }
public boolean acceptLiquid(Tilec source, Liquid liquid, float amount){ public boolean acceptLiquid(Tilec source, Liquid liquid, float amount){
return block.hasLiquids && liquids().get(liquid) + amount < block.liquidCapacity && block.consumes.liquidfilters.get(liquid.id); return block.hasLiquids && liquids.get(liquid) + amount < block.liquidCapacity && block.consumes.liquidfilters.get(liquid.id);
} }
public void handleLiquid(Tilec source, Liquid liquid, float amount){ public void handleLiquid(Tilec source, Liquid liquid, float amount){
liquids().add(liquid, amount); liquids.add(liquid, amount);
} }
public void dumpLiquid(Liquid liquid){ public void dumpLiquid(Liquid liquid){
@@ -400,7 +400,7 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc, QuadTree
if(other != null && other.team() == team() && other.block().hasLiquids && canDumpLiquid(other, liquid) && other.liquids() != null){ if(other != null && other.team() == team() && other.block().hasLiquids && canDumpLiquid(other, liquid) && other.liquids() != null){
float ofract = other.liquids().get(liquid) / other.block().liquidCapacity; float ofract = other.liquids().get(liquid) / other.block().liquidCapacity;
float fract = liquids().get(liquid) / block.liquidCapacity; float fract = liquids.get(liquid) / block.liquidCapacity;
if(ofract < fract) transferLiquid(other, (fract - ofract) * block.liquidCapacity / 2f, liquid); if(ofract < fract) transferLiquid(other, (fract - ofract) * block.liquidCapacity / 2f, liquid);
} }
@@ -417,30 +417,41 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc, QuadTree
if(next.acceptLiquid(this, liquid, flow)){ if(next.acceptLiquid(this, liquid, flow)){
next.handleLiquid(this, liquid, flow); next.handleLiquid(this, liquid, flow);
liquids().remove(liquid, flow); liquids.remove(liquid, flow);
} }
} }
public float moveLiquid(Tilec next, boolean leak, Liquid liquid){ public float moveLiquidForward(float leakResistance, Liquid liquid){
return moveLiquid(next, leak ? 1.5f : 100, liquid); Tile next = tile.getNearby(rotation());
if(next == null) return 0;
if(next.entity != null){
return moveLiquid(next.entity, liquid);
}else if(leakResistance != 100f && !next.block().solid && !next.block().hasLiquids){
float leakAmount = liquids.get(liquid) / leakResistance;
Puddles.deposit(next, tile(), liquid, leakAmount);
liquids.remove(liquid, leakAmount);
}
return 0;
} }
public float moveLiquid(Tilec next, float leakResistance, Liquid liquid){ public float moveLiquid(Tilec next, Liquid liquid){
if(next == null) return 0; if(next == null) return 0;
next = next.getLiquidDestination(this, liquid); next = next.getLiquidDestination(this, liquid);
if(next.team() == team() && next.block().hasLiquids && liquids().get(liquid) > 0f){ if(next.team() == team() && next.block().hasLiquids && liquids.get(liquid) > 0f){
if(next.acceptLiquid(this, liquid, 0f)){ if(next.acceptLiquid(this, liquid, 0f)){
float ofract = next.liquids().get(liquid) / next.block().liquidCapacity; float ofract = next.liquids().get(liquid) / next.block().liquidCapacity;
float fract = liquids().get(liquid) / block.liquidCapacity * block.liquidPressure; float fract = liquids.get(liquid) / block.liquidCapacity * block.liquidPressure;
float flow = Math.min(Mathf.clamp((fract - ofract) * (1f)) * (block.liquidCapacity), liquids().get(liquid)); float flow = Math.min(Mathf.clamp((fract - ofract) * (1f)) * (block.liquidCapacity), liquids.get(liquid));
flow = Math.min(flow, next.block().liquidCapacity - next.liquids().get(liquid) - 0.001f); flow = Math.min(flow, next.block().liquidCapacity - next.liquids().get(liquid) - 0.001f);
if(flow > 0f && ofract <= fract && next.acceptLiquid(this, liquid, flow)){ if(flow > 0f && ofract <= fract && next.acceptLiquid(this, liquid, flow)){
next.handleLiquid(this, liquid, flow); next.handleLiquid(this, liquid, flow);
liquids().remove(liquid, flow); liquids.remove(liquid, flow);
return flow; return flow;
}else if(ofract > 0.1f && fract > 0.1f){ }else if(ofract > 0.1f && fract > 0.1f){
//TODO these are incorrect effect positions //TODO these are incorrect effect positions
@@ -454,17 +465,13 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc, QuadTree
Fx.fire.at(fx, fy); Fx.fire.at(fx, fy);
} }
}else if((liquid.temperature > 0.7f && other.temperature < 0.55f) || (other.temperature > 0.7f && liquid.temperature < 0.55f)){ }else if((liquid.temperature > 0.7f && other.temperature < 0.55f) || (other.temperature > 0.7f && liquid.temperature < 0.55f)){
liquids().remove(liquid, Math.min(liquids().get(liquid), 0.7f * Time.delta())); liquids.remove(liquid, Math.min(liquids.get(liquid), 0.7f * Time.delta()));
if(Mathf.chance(0.2f * Time.delta())){ if(Mathf.chance(0.2f * Time.delta())){
Fx.steam.at(fx, fy); Fx.steam.at(fx, fy);
} }
} }
} }
} }
}else if(leakResistance != 100f && !next.block().solid && !next.block().hasLiquids){
float leakAmount = liquids().get(liquid) / leakResistance;
Puddles.deposit(next.tile(), tile(), liquid, leakAmount);
liquids().remove(liquid, leakAmount);
} }
return 0; return 0;
} }
@@ -651,6 +658,7 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc, QuadTree
float brcx = tile.drawx() + (block.size * tilesize / 2f) - (tilesize / 2f); float brcx = tile.drawx() + (block.size * tilesize / 2f) - (tilesize / 2f);
float brcy = tile.drawy() - (block.size * tilesize / 2f) + (tilesize / 2f); float brcy = tile.drawy() - (block.size * tilesize / 2f) + (tilesize / 2f);
Draw.z(Layer.blockOver);
Draw.color(Pal.gray); Draw.color(Pal.gray);
Fill.square(brcx, brcy, 2.5f, 45); Fill.square(brcx, brcy, 2.5f, 45);
Draw.color(cons.status().color); Draw.color(cons.status().color);
@@ -677,8 +685,8 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc, QuadTree
} }
public void drawLight(){ public void drawLight(){
if(block.hasLiquids && block.drawLiquidLight && liquids().current().lightColor.a > 0.001f){ if(block.hasLiquids && block.drawLiquidLight && liquids.current().lightColor.a > 0.001f){
drawLiquidLight(liquids().current(), liquids().smoothAmount()); drawLiquidLight(liquids.current(), liquids.smoothAmount());
} }
} }
@@ -781,8 +789,8 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc, QuadTree
} }
if(block.hasLiquids){ if(block.hasLiquids){
flammability += liquids().sum((liquid, amount) -> liquid.explosiveness * amount / 2f); flammability += liquids.sum((liquid, amount) -> liquid.explosiveness * amount / 2f);
explosiveness += liquids().sum((liquid, amount) -> liquid.flammability * amount / 2f); explosiveness += liquids.sum((liquid, amount) -> liquid.flammability * amount / 2f);
} }
if(block.consumes.hasPower() && block.consumes.getPower().buffered){ if(block.consumes.hasPower() && block.consumes.getPower().buffered){
@@ -791,7 +799,7 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc, QuadTree
if(block.hasLiquids){ if(block.hasLiquids){
liquids().each((liquid, amount) -> { liquids.each((liquid, amount) -> {
float splash = Mathf.clamp(amount / 4f, 0f, 10f); float splash = Mathf.clamp(amount / 4f, 0f, 10f);
for(int i = 0; i < Mathf.clamp(amount / 5, 0, 30); i++){ for(int i = 0; i < Mathf.clamp(amount / 5, 0, 30); i++){
@@ -825,7 +833,7 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc, QuadTree
float result = items.sum((item, amount) -> item.flammability * amount); float result = items.sum((item, amount) -> item.flammability * amount);
if(block.hasLiquids){ if(block.hasLiquids){
result += liquids().sum((liquid, amount) -> liquid.flammability * amount / 3f); result += liquids.sum((liquid, amount) -> liquid.flammability * amount / 3f);
} }
return result; return result;

View File

@@ -6,19 +6,15 @@ import mindustry.annotations.Annotations.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.type.*; import mindustry.type.*;
import java.io.*;
import static mindustry.Vars.content; import static mindustry.Vars.content;
public class DirectionalItemBuffer{ public class DirectionalItemBuffer{
public final long[][] buffers; public final long[][] buffers;
public final int[] indexes; public final int[] indexes;
private final float speed;
public DirectionalItemBuffer(int capacity, float speed){ public DirectionalItemBuffer(int capacity){
this.buffers = new long[4][capacity]; this.buffers = new long[4][capacity];
this.indexes = new int[5]; this.indexes = new int[5];
this.speed = speed;
} }
public boolean accepts(int buffer){ public boolean accepts(int buffer){
@@ -30,7 +26,7 @@ public class DirectionalItemBuffer{
buffers[buffer][indexes[buffer]++] = BufferItem.get((byte)item.id, Time.time()); buffers[buffer][indexes[buffer]++] = BufferItem.get((byte)item.id, Time.time());
} }
public Item poll(int buffer){ public Item poll(int buffer, float speed){
if(indexes[buffer] > 0){ if(indexes[buffer] > 0){
long l = buffers[buffer][0]; long l = buffers[buffer][0];
float time = BufferItem.time(l); float time = BufferItem.time(l);

View File

@@ -7,14 +7,11 @@ import mindustry.type.*;
import static mindustry.Vars.content; import static mindustry.Vars.content;
public class ItemBuffer{ public class ItemBuffer{
private final float speed;
private long[] buffer; private long[] buffer;
private int index; private int index;
public ItemBuffer(int capacity, float speed){ public ItemBuffer(int capacity){
this.buffer = new long[capacity]; this.buffer = new long[capacity];
this.speed = speed;
} }
public boolean accepts(){ public boolean accepts(){
@@ -30,7 +27,7 @@ public class ItemBuffer{
accept(item, (short)-1); accept(item, (short)-1);
} }
public Item poll(){ public Item poll(float speed){
if(index > 0){ if(index > 0){
long l = buffer[0]; long l = buffer[0];
float time = Float.intBitsToFloat(Pack.leftInt(l)); float time = Float.intBitsToFloat(Pack.leftInt(l));
@@ -42,18 +39,6 @@ public class ItemBuffer{
return null; return null;
} }
public short pollData(){
if(index > 0){
long l = buffer[0];
float time = Float.intBitsToFloat(Pack.leftInt(l));
if(Time.time() >= time + speed || Time.time() < time){
return Pack.rightShort(Pack.rightInt(l));
}
}
return -1;
}
public void remove(){ public void remove(){
System.arraycopy(buffer, 1, buffer, 0, index - 1); System.arraycopy(buffer, 1, buffer, 0, index - 1);
index--; index--;

View File

@@ -16,10 +16,11 @@ public class BufferedItemBridge extends ExtendingItemBridge{
super(name); super(name);
hasPower = false; hasPower = false;
hasItems = true; hasItems = true;
canOverdrive = true;
} }
public class BufferedItemBridgeEntity extends ExtendingItemBridgeEntity{ public class BufferedItemBridgeEntity extends ExtendingItemBridgeEntity{
ItemBuffer buffer = new ItemBuffer(bufferCapacity, speed); ItemBuffer buffer = new ItemBuffer(bufferCapacity);
@Override @Override
public void updateTransport(Tilec other){ public void updateTransport(Tilec other){
@@ -27,7 +28,7 @@ public class BufferedItemBridge extends ExtendingItemBridge{
buffer.accept(items.take()); buffer.accept(items.take());
} }
Item item = buffer.poll(); Item item = buffer.poll(speed / timeScale);
if(timer(timerAccept, 4) && item != null && other.acceptItem(this, item)){ if(timer(timerAccept, 4) && item != null && other.acceptItem(this, item)){
cycleSpeed = Mathf.lerpDelta(cycleSpeed, 4f, 0.05f); cycleSpeed = Mathf.lerpDelta(cycleSpeed, 4f, 0.05f);
other.handleItem(this, item); other.handleItem(this, item);

View File

@@ -41,6 +41,8 @@ public class ItemBridge extends Block{
hasItems = true; hasItems = true;
unloadable = false; unloadable = false;
group = BlockGroup.transportation; group = BlockGroup.transportation;
canOverdrive = false;
//point2 config is relative //point2 config is relative
config(Point2.class, (tile, i) -> ((ItemBridgeEntity)tile).link = Point2.pack(i.x + tile.tileX(), i.y + tile.tileY())); config(Point2.class, (tile, i) -> ((ItemBridgeEntity)tile).link = Point2.pack(i.x + tile.tileX(), i.y + tile.tileY()));
//integer is not //integer is not

View File

@@ -27,7 +27,7 @@ public class Junction extends Block{
} }
public class JunctionEntity extends TileEntity{ public class JunctionEntity extends TileEntity{
DirectionalItemBuffer buffer = new DirectionalItemBuffer(capacity, speed); DirectionalItemBuffer buffer = new DirectionalItemBuffer(capacity);
@Override @Override
public int acceptStack(Item item, int amount, Teamc source){ public int acceptStack(Item item, int amount, Teamc source){
@@ -43,7 +43,7 @@ public class Junction extends Block{
long l = buffer.buffers[i][0]; long l = buffer.buffers[i][0];
float time = BufferItem.time(l); float time = BufferItem.time(l);
if(Time.time() >= time + speed || Time.time() < time){ if(Time.time() >= time + speed / timeScale || Time.time() < time){
Item item = content.item(BufferItem.item(l)); Item item = content.item(BufferItem.item(l));
Tilec dest = nearby(i); Tilec dest = nearby(i);

View File

@@ -22,6 +22,7 @@ public class OverflowGate extends Block{
update = true; update = true;
group = BlockGroup.transportation; group = BlockGroup.transportation;
unloadable = false; unloadable = false;
canOverdrive = false;
} }
@Override @Override
@@ -136,7 +137,7 @@ public class OverflowGate extends Block{
public void read(Reads read, byte revision){ public void read(Reads read, byte revision){
super.read(read, revision); super.read(read, revision);
if(revision == 1){ if(revision == 1){
new DirectionalItemBuffer(25, 50f).read(read); new DirectionalItemBuffer(25).read(read);
}else if(revision == 3){ }else if(revision == 3){
lastInput = world.tile(read.i()); lastInput = world.tile(read.i());
lastItem = items.first(); lastItem = items.first();

View File

@@ -1,6 +1,5 @@
package mindustry.world.blocks.distribution; package mindustry.world.blocks.distribution;
import arc.util.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.type.*; import mindustry.type.*;
@@ -27,12 +26,12 @@ public class Router extends Block{
@Override @Override
public void updateTile(){ public void updateTile(){
if(lastItem == null && items.total() > 0){ if(lastItem == null && items.any()){
items.clear(); items.clear();
} }
if(lastItem != null){ if(lastItem != null){
time += 1f / speed * Time.delta(); time += 1f / speed * delta();
Tilec target = getTileTarget(lastItem, lastInput, false); Tilec target = getTileTarget(lastItem, lastInput, false);
if(target != null && (time >= 1f || !(target.block() instanceof Router))){ if(target != null && (time >= 1f || !(target.block() instanceof Router))){

View File

@@ -170,7 +170,7 @@ public class Sorter extends Block{
sortItem = content.item(read.s()); sortItem = content.item(read.s());
if(revision == 1){ if(revision == 1){
new DirectionalItemBuffer(20, 45f).read(read); new DirectionalItemBuffer(20).read(read);
} }
} }
} }

View File

@@ -114,7 +114,7 @@ public class Conduit extends LiquidBlock implements Autotiler{
smoothLiquid = Mathf.lerpDelta(smoothLiquid, liquids.currentAmount() / liquidCapacity, 0.05f); smoothLiquid = Mathf.lerpDelta(smoothLiquid, liquids.currentAmount() / liquidCapacity, 0.05f);
if(liquids.total() > 0.001f && timer(timerFlow, 1)){ if(liquids.total() > 0.001f && timer(timerFlow, 1)){
moveLiquid(tile.getNearbyEntity(rotation()), leakResistance, liquids.current()); moveLiquidForward(leakResistance, liquids.current());
noSleep(); noSleep();
}else{ }else{
sleep(); sleep();

View File

@@ -44,7 +44,7 @@ public class LiquidBridge extends ItemBridge{
if(uptime >= 0.5f){ if(uptime >= 0.5f){
if(moveLiquid(other, false, liquids.current()) > 0.1f){ if(moveLiquid(other, liquids.current()) > 0.1f){
cycleSpeed = Mathf.lerpDelta(cycleSpeed, 4f, 0.05f); cycleSpeed = Mathf.lerpDelta(cycleSpeed, 4f, 0.05f);
}else{ }else{
cycleSpeed = Mathf.lerpDelta(cycleSpeed, 1f, 0.01f); cycleSpeed = Mathf.lerpDelta(cycleSpeed, 1f, 0.01f);

View File

@@ -39,7 +39,7 @@ public class LiquidExtendingBridge extends ExtendingItemBridge{
} }
if(uptime >= 0.5f){ if(uptime >= 0.5f){
if(moveLiquid(other, false, liquids.current()) > 0.1f){ if(moveLiquid(other, liquids.current()) > 0.1f){
cycleSpeed = Mathf.lerpDelta(cycleSpeed, 4f, 0.05f); cycleSpeed = Mathf.lerpDelta(cycleSpeed, 4f, 0.05f);
}else{ }else{
cycleSpeed = Mathf.lerpDelta(cycleSpeed, 1f, 0.01f); cycleSpeed = Mathf.lerpDelta(cycleSpeed, 1f, 0.01f);

View File

@@ -24,6 +24,8 @@ public class LiquidSource extends Block{
liquidCapacity = 100f; liquidCapacity = 100f;
configurable = true; configurable = true;
outputsLiquid = true; outputsLiquid = true;
saveConfig = true;
config(Liquid.class, (tile, l) -> ((LiquidSourceEntity)tile).source = l); config(Liquid.class, (tile, l) -> ((LiquidSourceEntity)tile).source = l);
configClear(tile -> ((LiquidSourceEntity)tile).source = null); configClear(tile -> ((LiquidSourceEntity)tile).source = null);
} }

View File

@@ -23,36 +23,6 @@ public abstract class StorageBlock extends Block{
public class StorageBlockEntity extends TileEntity{ public class StorageBlockEntity extends TileEntity{
protected @Nullable Tilec linkedCore; protected @Nullable Tilec linkedCore;
/**
* Removes an item and returns it. If item is not null, it should return the item.
* Returns null if no items are there.
*/
@Nullable
public Item removeItem(@Nullable Item item){
if(item == null){
return items.take();
}else{
if(items.has(item)){
items.remove(item, 1);
return item;
}
return null;
}
}
/**
* Returns whether this storage block has the specified item.
* If the item is null, it should return whether it has ANY items.
*/
public boolean hasItem(@Nullable Item item){
if(item == null){
return items.total() > 0;
}else{
return items.has(item);
}
}
@Override @Override
public boolean acceptItem(Tilec source, Item item){ public boolean acceptItem(Tilec source, Item item){
return linkedCore != null ? linkedCore.acceptItem(source, item) : items.get(item) < getMaximumAccepted(item); return linkedCore != null ? linkedCore.acceptItem(source, item) : items.get(item) < getMaximumAccepted(item);

View File

@@ -137,6 +137,10 @@ public class ItemModule extends BlockModule{
return total; return total;
} }
public boolean any(){
return total > 0;
}
public Item first(){ public Item first(){
for(int i = 0; i < items.length; i++){ for(int i = 0; i < items.length; i++){
if(items[i] > 0){ if(items[i] > 0){

View File

@@ -1,3 +1,3 @@
org.gradle.daemon=true org.gradle.daemon=true
org.gradle.jvmargs=-Xms256m -Xmx1024m org.gradle.jvmargs=-Xms256m -Xmx1024m
archash=84bbb36f336c108fdb85ae1bcb8eeeac42447460 archash=96baae84beb618f21b6b01b1da3ce11991df5730