From e8ee6cc78e4b3adcfa38bb2beb2a4ea4e6ed3a54 Mon Sep 17 00:00:00 2001 From: = Date: Fri, 10 Jan 2025 22:53:51 -0300 Subject: [PATCH] flow change --- assets/bundles/bundle.properties | 3 +- src/omaloon/content/OlLiquids.java | 19 ++++++++ src/omaloon/math/OlMath.java | 6 +-- .../blocks/liquid/PressureLiquidValve.java | 5 +- src/omaloon/world/interfaces/HasPressure.java | 2 + src/omaloon/world/meta/PressureSection.java | 46 +++++++++++++++++++ src/omaloon/world/modules/PressureModule.java | 9 ++-- 7 files changed, 78 insertions(+), 12 deletions(-) diff --git a/assets/bundles/bundle.properties b/assets/bundles/bundle.properties index 0e1c0b82..f5a91bdd 100644 --- a/assets/bundles/bundle.properties +++ b/assets/bundles/bundle.properties @@ -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 @@ -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: diff --git a/src/omaloon/content/OlLiquids.java b/src/omaloon/content/OlLiquids.java index e8249f54..b55b9a13 100644 --- a/src/omaloon/content/OlLiquids.java +++ b/src/omaloon/content/OlLiquids.java @@ -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.*; @@ -16,6 +18,7 @@ public class OlLiquids { end; public static ObjectFloatMap densities = new ObjectFloatMap<>(); + public static ObjectFloatMap viscosities = new ObjectFloatMap<>(); public static void load(){ glacium = new CrystalLiquid("glacium", valueOf("5e929d")){{ @@ -42,11 +45,17 @@ 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) { @@ -54,7 +63,17 @@ public static void addDensity(Liquid liquid, float 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); + } } diff --git a/src/omaloon/math/OlMath.java b/src/omaloon/math/OlMath.java index 80d8c614..325467b2 100644 --- a/src/omaloon/math/OlMath.java +++ b/src/omaloon/math/OlMath.java @@ -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. @@ -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 } diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidValve.java b/src/omaloon/world/blocks/liquid/PressureLiquidValve.java index 473903bd..4d7eef33 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidValve.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidValve.java @@ -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) { diff --git a/src/omaloon/world/interfaces/HasPressure.java b/src/omaloon/world/interfaces/HasPressure.java index 88ffb70e..7538c734 100644 --- a/src/omaloon/world/interfaces/HasPressure.java +++ b/src/omaloon/world/interfaces/HasPressure.java @@ -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); diff --git a/src/omaloon/world/meta/PressureSection.java b/src/omaloon/world/meta/PressureSection.java index 6fc1fe2b..4364a545 100644 --- a/src/omaloon/world/meta/PressureSection.java +++ b/src/omaloon/world/meta/PressureSection.java @@ -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 { @@ -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> 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 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 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))); + } + } + } } diff --git a/src/omaloon/world/modules/PressureModule.java b/src/omaloon/world/modules/PressureModule.java index bc4cb48e..2c6e0e76 100644 --- a/src/omaloon/world/modules/PressureModule.java +++ b/src/omaloon/world/modules/PressureModule.java @@ -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 { @@ -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; } @@ -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; }