Skip to content

Commit

Permalink
flow change
Browse files Browse the repository at this point in the history
  • Loading branch information
= committed Jan 11, 2025
1 parent 5e7cf71 commit e8ee6cc
Show file tree
Hide file tree
Showing 7 changed files with 78 additions and 12 deletions.
3 changes: 2 additions & 1 deletion assets/bundles/bundle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -331,6 +331,7 @@ block.omaloon-hammer-drill.description = When placed on ore, outputs items. Effi
category.omaloon-pressure = Pressure

stat.omaloon-density = Density
stat.omaloon-viscosity.format = @%, @ Todo

stat.omaloon-consumepressure = Consume Pressure
stat.omaloon-minpressure = Min Pressure
Expand All @@ -345,7 +346,7 @@ stat.omaloon-optimal-pressure = Optimal Pressure
stat.omaloon-optimal-pressure.format = \uC357 @ pressure units (@%)

## ui units
unit.omaloon-liquidPerWorldUnit = Liquid per World cube
unit.omaloon-liquidperworldunit = Liquid per World cube
unit.omaloon-pressuresecond = pressure units / second
unit.omaloon-pressureunits = pressure units
bar.air = Air:
Expand Down
19 changes: 19 additions & 0 deletions src/omaloon/content/OlLiquids.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package omaloon.content;

import arc.*;
import arc.struct.*;
import arc.util.*;
import mindustry.content.*;
import mindustry.type.*;
import mindustry.world.meta.*;
import omaloon.type.liquid.*;
import omaloon.world.meta.*;

Expand All @@ -16,6 +18,7 @@ public class OlLiquids {
end;

public static ObjectFloatMap<Liquid> densities = new ObjectFloatMap<>();
public static ObjectFloatMap<Liquid> viscosities = new ObjectFloatMap<>();

public static void load(){
glacium = new CrystalLiquid("glacium", valueOf("5e929d")){{
Expand All @@ -42,19 +45,35 @@ public static void load(){
}};

addDensity(Liquids.water, 1000);
addViscosity(Liquids.water, 10);
addDensity(Liquids.slag, 1600);
addViscosity(Liquids.slag, 250);
addDensity(Liquids.oil, 700);
addViscosity(Liquids.oil, 50);
addDensity(Liquids.cryofluid, 200);
addViscosity(Liquids.cryofluid, 1);
addDensity(glacium, 1300);
addViscosity(glacium, 13);
addDensity(tiredGlacium, 1300);
addViscosity(tiredGlacium, 13);
}

public static void addDensity(Liquid liquid, float density) {
densities.put(liquid, density);
liquid.stats.add(OlStats.density, density, OlStats.liquidPerWorldUnit);
}

public static void addViscosity(Liquid liquid, float viscosity) {
viscosities.put(liquid, viscosity);
liquid.stats.remove(Stat.viscosity);
liquid.stats.add(Stat.viscosity, Core.bundle.get("stat.omaloon-viscosity.format"), liquid.viscosity * 100f, viscosity);
}

public static float getDensity(@Nullable Liquid liquid) {
return densities.get(liquid, 1.2f);
}

public static float getViscosity(@Nullable Liquid liquid) {
return viscosities.get(liquid, 1f);
}
}
6 changes: 2 additions & 4 deletions src/omaloon/math/OlMath.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package omaloon.math;

import arc.math.*;

public class OlMath {
/**
* Solves for the flow of a fluid through an area based on a difference of pressure.
Expand All @@ -13,8 +11,8 @@ public class OlMath {
*
* returns the amount of fluid in liquid units that passes through the area over a certain time.
*/
public static float bernoulliFlowRate(float opening, float pressureStart, float pressureEnd, float density, float time) {
return opening * (pressureEnd - pressureStart) / density;
public static float flowRate(float opening, float pressureStart, float pressureEnd, float viscosity) {
return opening * (pressureEnd - pressureStart) / (viscosity * 60f);
}
// TODO rename
}
5 changes: 2 additions & 3 deletions src/omaloon/world/blocks/liquid/PressureLiquidValve.java
Original file line number Diff line number Diff line change
Expand Up @@ -217,13 +217,12 @@ public void updatePressure() {
if (jammed) return;
if (pressureAmount < openMin) {
effectInterval += delta();
addFluid(null, Math.min(openMin - pressureAmount, OlMath.bernoulliFlowRate(pressureLoss, 0, pressureAmount, 1f, 1f)));
addFluid(null, Math.min(openMin - pressureAmount, OlMath.flowRate(pressureLoss, 0, pressureAmount, OlLiquids.getViscosity(pressure.getMain()))));
draining = Mathf.approachDelta(draining, 1, 0.014f);

}
if (pressureAmount > openMax) {
effectInterval += delta();
removeFluid(pressure.getMain(), Math.min(pressureAmount - openMax, OlMath.bernoulliFlowRate(pressureLoss, pressureAmount, 0, 1f, 1f)));
removeFluid(pressure.getMain(), Math.min(pressureAmount - openMax, OlMath.flowRate(pressureLoss, pressureAmount, 0, OlLiquids.getViscosity(pressure.getMain()))));
draining = Mathf.approachDelta(draining, 1, 0.014f);
}
if (effectInterval > pumpingEffectInterval) {
Expand Down
2 changes: 2 additions & 0 deletions src/omaloon/world/interfaces/HasPressure.java
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,8 @@ default void removeFluid(@Nullable Liquid liquid, float amount) {
* method to update pressure related things
*/
default void updatePressure() {
if (nextBuilds().contains(other -> other.pressure().section != this)) pressure().section.updateTransfer();

Vars.content.liquids().each(liquid -> {
if (Mathf.round(pressure().getPressure(liquid)) < pressureConfig().minPressure - 1) damage(pressureConfig().underPressureDamage);
if (Mathf.round(pressure().getPressure(liquid)) > pressureConfig().maxPressure + 1) damage(pressureConfig().overPressureDamage);
Expand Down
46 changes: 46 additions & 0 deletions src/omaloon/world/meta/PressureSection.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package omaloon.world.meta;

import arc.math.*;
import arc.struct.*;
import arc.struct.ObjectMap.*;
import arc.util.*;
import mindustry.*;
import mindustry.type.*;
import omaloon.content.*;
import omaloon.math.*;
import omaloon.world.interfaces.*;

public class PressureSection {
Expand Down Expand Up @@ -80,4 +84,46 @@ public void updateLiquids() {
for(Liquid liquid : Vars.content.liquids()) addFluid(liquid, liquids[liquid.id]);
addFluid(null, air);
}

public void updateTransfer() {
Seq<Entry<HasPressure, HasPressure>> links = new Seq<>();

builds.each(b -> {
b.nextBuilds().retainAll(other -> other.pressure().section != this).each(other -> {
links.add(new Entry<>(){{
key = other;
value = b;
}});
});
});

FloatSeq amounts = new FloatSeq();

for(Entry<HasPressure, HasPressure> entry : links) {
@Nullable Liquid main = entry.value.pressure().getMain();
float flow = OlMath.flowRate(entry.value.pressureConfig().fluidCapacity,
entry.key.pressure().getPressure(main),
entry.value.pressure().getPressure(main),
OlLiquids.getViscosity(main)
)/(2f * links.size);

if (
entry.key.acceptsPressurizedFluid(entry.value, main, flow) &&
entry.value.outputsPressurizedFluid(entry.key, main, flow)
) {
amounts.add(flow);
} else {
amounts.add(0);
}
}


for(Entry<HasPressure, HasPressure> entry : links) {
@Nullable Liquid main = entry.value.pressure().getMain();
if (amounts.get(links.indexOf(entry)) != 0) {
entry.key.addFluid(main, amounts.get(links.indexOf(entry)));
entry.value.removeFluid(main, amounts.get(links.indexOf(entry)));
}
}
}
}
9 changes: 5 additions & 4 deletions src/omaloon/world/modules/PressureModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import mindustry.content.*;
import mindustry.type.*;
import mindustry.world.modules.*;
import omaloon.content.*;
import omaloon.world.meta.*;

public class PressureModule extends BlockModule {
Expand All @@ -27,14 +28,14 @@ public class PressureModule extends BlockModule {
public void addFluid(@Nullable Liquid liquid, float amount, PressureConfig reference) {
if (liquid == null) {
air += amount;
pressure = air / reference.fluidCapacity * arbitraryPressureScalar;
pressure = air / reference.fluidCapacity * OlLiquids.getDensity(liquid);
} else {
if (air < 0) {
air = 0;
pressure = 0;
}
liquids[liquid.id] += amount;
pressures[liquid.id] = liquids[liquid.id] / reference.fluidCapacity * arbitraryPressureScalar;
pressures[liquid.id] = liquids[liquid.id] / reference.fluidCapacity * OlLiquids.getDensity(liquid);
}
if (liquid != null) current = liquid;
}
Expand Down Expand Up @@ -91,10 +92,10 @@ public void read(Reads read) {
public void removeFluid(@Nullable Liquid liquid, float amount, PressureConfig reference) {
if (liquid == null) {
air -= (getMain() != null ? Math.min(air, amount) : amount);
pressure = air / reference.fluidCapacity * arbitraryPressureScalar;
pressure = air / reference.fluidCapacity * OlLiquids.getDensity(liquid);
} else {
liquids[liquid.id] = Mathf.maxZero(liquids[liquid.id] - amount);
pressures[liquid.id] = liquids[liquid.id] / reference.fluidCapacity * arbitraryPressureScalar;
pressures[liquid.id] = liquids[liquid.id] / reference.fluidCapacity * OlLiquids.getDensity(liquid);
}
if (liquid != null) current = liquid;
}
Expand Down

0 comments on commit e8ee6cc

Please sign in to comment.