From 4a8e7b64213116e47113514d0270e37a591248dd Mon Sep 17 00:00:00 2001 From: = Date: Sun, 12 Jan 2025 01:10:07 -0300 Subject: [PATCH] flow change part 2 (havent done it dlc) --- src/omaloon/content/OlLiquids.java | 4 +- .../content/blocks/OlDistributionBlocks.java | 2 +- .../blocks/liquid/PressureLiquidPump.java | 35 ++-- .../world/blocks/production/Pressurizer.java | 181 ------------------ src/omaloon/world/interfaces/HasPressure.java | 2 +- src/omaloon/world/meta/PressureSection.java | 83 ++++++-- 6 files changed, 92 insertions(+), 215 deletions(-) delete mode 100644 src/omaloon/world/blocks/production/Pressurizer.java diff --git a/src/omaloon/content/OlLiquids.java b/src/omaloon/content/OlLiquids.java index b55b9a13..1302b1e4 100644 --- a/src/omaloon/content/OlLiquids.java +++ b/src/omaloon/content/OlLiquids.java @@ -51,7 +51,7 @@ public static void load(){ addDensity(Liquids.oil, 700); addViscosity(Liquids.oil, 50); addDensity(Liquids.cryofluid, 200); - addViscosity(Liquids.cryofluid, 1); + addViscosity(Liquids.cryofluid, 1.2f); addDensity(glacium, 1300); addViscosity(glacium, 13); addDensity(tiredGlacium, 1300); @@ -70,7 +70,7 @@ public static void addViscosity(Liquid liquid, float viscosity) { } public static float getDensity(@Nullable Liquid liquid) { - return densities.get(liquid, 1.2f); + return densities.get(liquid, 1f); } public static float getViscosity(@Nullable Liquid liquid) { diff --git a/src/omaloon/content/blocks/OlDistributionBlocks.java b/src/omaloon/content/blocks/OlDistributionBlocks.java index d7d35b95..337b6ab9 100644 --- a/src/omaloon/content/blocks/OlDistributionBlocks.java +++ b/src/omaloon/content/blocks/OlDistributionBlocks.java @@ -129,7 +129,7 @@ public static void load() { researchCost = with( OlItems.cobalt, 20 ); - pressureTransfer = 0.1f; + pumpStrength = 0.1f; pressureDifference = 20f; }}; diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidPump.java b/src/omaloon/world/blocks/liquid/PressureLiquidPump.java index 00155bea..51d9103a 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidPump.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidPump.java @@ -16,6 +16,7 @@ import mindustry.type.*; import mindustry.world.*; import mindustry.world.blocks.*; +import omaloon.content.*; import omaloon.utils.*; import omaloon.world.interfaces.*; import omaloon.world.meta.*; @@ -27,7 +28,7 @@ public class PressureLiquidPump extends Block { public PressureConfig pressureConfig = new PressureConfig(); - public float pressureTransfer = 0.1f; + public float pumpStrength = 0.1f; public float pressureDifference = 10; @@ -115,7 +116,7 @@ public void load() { public void setStats() { super.setStats(); pressureConfig.addStats(stats); - stats.add(OlStats.pressureFlow, Mathf.round(pressureTransfer * 60f, 2), OlStats.pressureSecond); + stats.add(OlStats.pressureFlow, Mathf.round(pumpStrength * 60f, 2), OlStats.pressureSecond); } public class PressureLiquidPumpBuild extends Building implements HasPressure { @@ -266,18 +267,24 @@ public void updateTile() { HasPressure front = getTo(); HasPressure back = getFrom(); - if (front != null && back != null) { - Liquid pumpLiquid = configurable ? Vars.content.liquid(filter) : back.pressure().getMain(); - float frontPressure = front.pressure().getPressure(pumpLiquid), backPressure = back.pressure().getPressure(pumpLiquid); - float flow = pressureTransfer/chainSize() * (backPressure - frontPressure + pressureDifference * chainSize()); - if (pumpLiquid != null) flow = Mathf.clamp(flow, -front.pressure().liquids[pumpLiquid.id], back.pressure().liquids[pumpLiquid.id]); - if ( - front.acceptsPressurizedFluid(back, pumpLiquid, flow) && - back.outputsPressurizedFluid(front, pumpLiquid, flow) - ) { - front.addFluid(pumpLiquid, flow); - back.removeFluid(pumpLiquid, flow); - } + @Nullable Liquid pumpLiquid = configurable ? Vars.content.liquid(filter) : (back == null ? null : back.pressure().getMain()); + + float frontPressure = front == null ? 0 : front.pressure().getPressure(pumpLiquid); + float backPressure = back == null ? 0 : back.pressure().getPressure(pumpLiquid); + + float flow = pumpStrength/chainSize() * ((backPressure + pressureDifference * chainSize()) - frontPressure) / OlLiquids.getViscosity(pumpLiquid); + + if (pumpLiquid != null && front != null && back != null) { + flow = Mathf.clamp(flow, -front.pressure().get(pumpLiquid), back.pressure().get(pumpLiquid)); + } + + if ( + front == null || back == null || + (front.acceptsPressurizedFluid(back, pumpLiquid, flow) && + back.outputsPressurizedFluid(front, pumpLiquid, flow)) + ) { + if (front != null) front.addFluid(pumpLiquid, flow); + if (back != null) back.removeFluid(pumpLiquid, flow); } } } diff --git a/src/omaloon/world/blocks/production/Pressurizer.java b/src/omaloon/world/blocks/production/Pressurizer.java deleted file mode 100644 index 0e51216a..00000000 --- a/src/omaloon/world/blocks/production/Pressurizer.java +++ /dev/null @@ -1,181 +0,0 @@ -package omaloon.world.blocks.production; - -import arc.*; -import arc.Graphics.*; -import arc.graphics.g2d.*; -import arc.math.*; -import arc.struct.*; -import arc.util.*; -import arc.util.io.*; -import mindustry.entities.units.*; -import mindustry.gen.*; -import mindustry.world.*; -import mindustry.world.draw.*; -import mindustry.world.meta.*; -import omaloon.world.interfaces.*; -import omaloon.world.meta.*; -import omaloon.world.modules.*; - -public class Pressurizer extends Block { - public PressureConfig pressureConfig = new PressureConfig(); - - public DrawBlock drawer = new DrawDefault(); - - public TextureRegion overlayRegion; - - public float progressTime = 60f; - public float warmupSpeed = 0.14f; - - public float outputPressure = 0f; - - public boolean continuous = false; - - public Pressurizer(String name) { - super(name); - update = true; - destructible = true; - solid = true; - saveConfig = copyConfig = true; - - config(Boolean.class, (PressurizerBuild build, Boolean bool) -> build.reverse = bool); - } - - @Override - public void drawPlanRegion(BuildPlan plan, Eachable list) { - drawer.drawPlan(this, plan, list); - if (plan.config instanceof Boolean bool && bool) Draw.rect(overlayRegion, plan.drawx(), plan.drawy(), rotate ? plan.rotation * 90f : 0); - } - - @Override public void getRegionsToOutline(Seq out) { - drawer.getRegionsToOutline(this, out); - } - - @Override - protected TextureRegion[] icons() { - return drawer.finalIcons(this); - } - - @Override - public void load() { - super.load(); - - drawer.load(this); - - overlayRegion = Core.atlas.find(name + "-overlay"); - } - - @Override - public void setBars() { - super.setBars(); - - pressureConfig.addBars(this); - } - - @Override - public void setStats() { - super.setStats(); - - pressureConfig.addStats(stats); - if (outputPressure != 0) stats.add(OlStats.outputPressure, Strings.autoFixed(outputPressure * (continuous ? 60f : 1f), 2), continuous ? OlStats.pressureSecond : OlStats.pressureUnits); - if (!continuous) stats.add(Stat.productionTime, Strings.autoFixed(progressTime/60f, 2), StatUnit.seconds); - } - - public class PressurizerBuild extends Building implements HasPressure { - public PressureModule pressure = new PressureModule(); - - public boolean reverse; - - public float warmup, progress, totalProgress; - - @Override public Cursor getCursor() { - return Cursor.SystemCursor.hand; - } - - @Override - public void draw() { - drawer.draw(this); - if (reverse) Draw.rect(overlayRegion, x, y, drawrot()); - } - @Override - public void drawLight() { - super.drawLight(); - drawer.drawLight(this); - } - - @Override public HasPressure getSectionDestination(HasPressure from) { - return null; - } - - @Override - public void onProximityUpdate() { - super.onProximityUpdate(); - - new PressureSection().mergeFlood(this); - } - - @Override public PressureModule pressure() { - return pressure; - } - @Override public PressureConfig pressureConfig() { - return pressureConfig; - } - - @Override public float progress() { - return progress; - } - - @Override - public void read(Reads read, byte revision) { - super.read(read, revision); - pressure.read(read); - - progress = read.f(); - totalProgress = read.f(); - warmup = read.f(); - - reverse = read.bool(); - } - - @Override public void tapped() { - configure(!reverse); - } - - @Override public float totalProgress() { - return totalProgress; - } - - @Override - public void updateTile() { - updatePressure(); - - if (efficiency > 0) { - progress += getProgressIncrease(progressTime); - warmup = Mathf.approachDelta(warmup, 1, warmupSpeed); - totalProgress += warmup * edelta(); - - if (continuous) addFluid(null, outputPressure * warmup * (reverse ? -1f : 1f)); - } else warmup = Mathf.approachDelta(warmup, 0, warmupSpeed); - - if(progress >= 1f){ - if (!continuous) addFluid(null, outputPressure * warmup * (reverse ? -1f : 1f)); - progress %= 1f; - } - } - - @Override public float warmup() { - return warmup; - } - - @Override - public void write(Writes write) { - super.write(write); - pressure.write(write); - - write.f(progress); - write.f(totalProgress); - write.f(warmup); - - write.bool(reverse); - } - } -} diff --git a/src/omaloon/world/interfaces/HasPressure.java b/src/omaloon/world/interfaces/HasPressure.java index 7538c734..16edafff 100644 --- a/src/omaloon/world/interfaces/HasPressure.java +++ b/src/omaloon/world/interfaces/HasPressure.java @@ -88,7 +88,7 @@ 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(); +// 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); diff --git a/src/omaloon/world/meta/PressureSection.java b/src/omaloon/world/meta/PressureSection.java index 4364a545..c0f6461f 100644 --- a/src/omaloon/world/meta/PressureSection.java +++ b/src/omaloon/world/meta/PressureSection.java @@ -98,31 +98,82 @@ public void updateTransfer() { }); FloatSeq amounts = new FloatSeq(); - - for(Entry entry : links) { - @Nullable Liquid main = entry.value.pressure().getMain(); + + Vars.content.liquids().each(main -> { + amounts.clear(); + for (Entry entry : links) { + 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 ( + ( + flow > 0 ? + ( + entry.key.acceptsPressurizedFluid(entry.value, main, flow) && + entry.value.outputsPressurizedFluid(entry.key, main, flow) + ) : + ( + entry.value.acceptsPressurizedFluid(entry.key, main, flow) && + entry.key.outputsPressurizedFluid(entry.value, main, flow) + ) + ) && + (entry.key.pressure().get(main) > 0 || entry.value.pressure().get(main) > 0) + ) { + amounts.add(flow); + } else { + amounts.add(0); + } + } + for (Entry entry : links) { + float flow = Mathf.clamp( + amounts.get(links.indexOf(entry)), + -Math.abs(entry.key.pressure().get(main) - entry.value.pressure().get(main))/2f, + Math.abs(entry.key.pressure().get(main) - entry.value.pressure().get(main))/2f + ); +// float flow = amounts.get(links.indexOf(entry)); + if (flow != 0) { + entry.key.addFluid(main, flow); + entry.value.removeFluid(main, flow); + } + } + }); + amounts.clear(); + for (Entry entry : links) { float flow = OlMath.flowRate(entry.value.pressureConfig().fluidCapacity, - entry.key.pressure().getPressure(main), - entry.value.pressure().getPressure(main), - OlLiquids.getViscosity(main) - )/(2f * links.size); + entry.key.pressure().getPressure(null), + entry.value.pressure().getPressure(null), + OlLiquids.getViscosity(null) + ) / (2f * links.size); if ( - entry.key.acceptsPressurizedFluid(entry.value, main, flow) && - entry.value.outputsPressurizedFluid(entry.key, main, flow) + ( + flow > 0 ? + ( + entry.key.acceptsPressurizedFluid(entry.value, null, flow) && + entry.value.outputsPressurizedFluid(entry.key, null, flow) + ) : ( + entry.value.acceptsPressurizedFluid(entry.key, null, flow) && + entry.key.outputsPressurizedFluid(entry.value, null, 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))); + for (Entry entry : links) { + float flow = Mathf.clamp( + amounts.get(links.indexOf(entry)), + -Math.abs(entry.key.pressure().get(null) - entry.value.pressure().get(null))/2f, + Math.abs(entry.key.pressure().get(null) - entry.value.pressure().get(null))/2f + ); + if (flow != 0) { + entry.key.addFluid(null, amounts.get(links.indexOf(entry))); + entry.value.removeFluid(null, amounts.get(links.indexOf(entry))); } } }