From b3138ecd2dead630a3c88471203ede3634b0b644 Mon Sep 17 00:00:00 2001 From: = Date: Wed, 4 Dec 2024 23:10:47 -0300 Subject: [PATCH 01/54] add liquids to the system --- src/omaloon/world/meta/PressureConfig.java | 57 ++++++++++++++----- src/omaloon/world/modules/PressureModule.java | 56 +++++++++++++++++- 2 files changed, 97 insertions(+), 16 deletions(-) diff --git a/src/omaloon/world/meta/PressureConfig.java b/src/omaloon/world/meta/PressureConfig.java index 5abfa518..d20b55af 100644 --- a/src/omaloon/world/meta/PressureConfig.java +++ b/src/omaloon/world/meta/PressureConfig.java @@ -1,13 +1,11 @@ package omaloon.world.meta; import arc.*; -import arc.graphics.Color; +import arc.graphics.*; import arc.math.*; import arc.struct.*; -import arc.util.*; -import mindustry.gen.Building; -import mindustry.graphics.*; -import mindustry.type.Liquid; +import mindustry.gen.*; +import mindustry.type.*; import mindustry.ui.*; import mindustry.world.*; import mindustry.world.meta.*; @@ -15,19 +13,24 @@ import omaloon.world.interfaces.*; public class PressureConfig { - public boolean - acceptsPressure = true, - outputsPressure = true, + public boolean acceptsPressure = true; + public boolean outputsPressure = true; /** * Determines whether linkList will function as a whitelist */ - isWhitelist = false; + public boolean isWhitelist = false; + public float overPressureDamage = 0.33f, underPressureDamage = 0.66f, maxPressure = 50, minPressure = -50f; + /** + * Standard capacity for this block. Does not define max amount that this can hold. That is defined by maxPressure and minPressure. + */ + public float fluidCapacity = 5; + /** * List of blocks that are allowed/disallowed (depends on isWhitelist true/false) for pressure connections. *

@@ -58,11 +61,33 @@ public void addStats(Stats stats) { public void addBars(Block block) { block.removeBar("liquid"); +// block.addBar("pressure-liquid", (Building entity) -> new Bar( +// () -> { +// HasPressure build = (HasPressure)entity; +// Liquid current = entity.liquids != null ? entity.liquids.current() : null; +// String liquidName = (current == null || entity.liquids.get(current) <= 0.001f) +// ? Core.bundle.get("bar.air") +// : current.localizedName; +// +// return Core.bundle.format("bar.pressure-liquid", +// liquidName, +// Mathf.round(build.getPressure(), 1), +// Mathf.round(build.getPressure() > 0 ? build.pressureConfig().maxPressure : build.pressureConfig().minPressure, 1)); +// }, +// () -> { +// Liquid current = entity.liquids != null ? entity.liquids.current() : null; +// return current != null && entity.liquids.get(current) > 0.001f ? current.color : Color.lightGray; +// }, +// () -> { +// Liquid current = entity.liquids != null ? entity.liquids.current() : null; +// return current != null ? entity.liquids.get(current) / block.liquidCapacity : 0f; +// } +// )); block.addBar("pressure-liquid", (Building entity) -> new Bar( () -> { HasPressure build = (HasPressure)entity; - Liquid current = entity.liquids != null ? entity.liquids.current() : null; - String liquidName = (current == null || entity.liquids.get(current) <= 0.001f) + Liquid current = build.pressure().current; + String liquidName = (current == null || build.pressure().liquids[current.id] < 0.01f) ? Core.bundle.get("bar.air") : current.localizedName; @@ -72,12 +97,14 @@ public void addBars(Block block) { Mathf.round(build.getPressure() > 0 ? build.pressureConfig().maxPressure : build.pressureConfig().minPressure, 1)); }, () -> { - Liquid current = entity.liquids != null ? entity.liquids.current() : null; - return current != null && entity.liquids.get(current) > 0.001f ? current.color : Color.lightGray; + HasPressure build = (HasPressure)entity; + Liquid current = build.pressure().current; + return current != null && build.pressure().liquids[current.id] > 0.001f ? current.color : Color.lightGray; }, () -> { - Liquid current = entity.liquids != null ? entity.liquids.current() : null; - return current != null ? entity.liquids.get(current) / block.liquidCapacity : 0f; + HasPressure build = (HasPressure)entity; + Liquid current = build.pressure().current; + return current != null ? Mathf.clamp(build.pressure().currentAmount()/(build.pressure().currentAmount() + build.pressure().air)) : 0; } )); } diff --git a/src/omaloon/world/modules/PressureModule.java b/src/omaloon/world/modules/PressureModule.java index 3fca25f1..11162825 100644 --- a/src/omaloon/world/modules/PressureModule.java +++ b/src/omaloon/world/modules/PressureModule.java @@ -1,15 +1,69 @@ package omaloon.world.modules; +import arc.math.*; +import arc.util.*; import arc.util.io.*; +import mindustry.*; +import mindustry.type.*; import mindustry.world.modules.*; +import omaloon.world.meta.*; public class PressureModule extends BlockModule { - public float pressure; + public static float arbitraryPressureScalar = 10f; + + public float[] liquids = new float[Vars.content.liquids().size]; + public float[] pressures = new float[Vars.content.liquids().size]; + public float air = 0, pressure = 0; + + public @Nullable Liquid current; + + /** + * Adds a certain amount of a fluid into this module, updating it's pressure accordingly. A null liquid means that air is being added to it. + */ + public void addFluid(@Nullable Liquid liquid, float amount, PressureConfig reference) { + if (liquid == null) { + air += amount; + pressure = air / reference.fluidCapacity * arbitraryPressureScalar; + } else { + liquids[liquid.id] += amount; + pressures[liquid.id] = liquids[liquid.id] / reference.fluidCapacity * arbitraryPressureScalar; + } + current = liquid; + } + + public float currentAmount() { + return current == null ? air : liquids[current.id]; + } + + /** + * Returns the amount of pressure felt by this module from a certain liquid + the pressure of air inside this module. + */ + public float getPressure(@Nullable Liquid liquid) { + if (liquid == null) { + return pressure; + } + return pressures[liquid.id] + pressure; + } @Override public void read(Reads read) { pressure = read.f(); } + + /** + * Removes a certain amount of a fluid from this module, updating pressure accordingly. A null liquid means that air is being removed from it. Liquids cannot be negative. + */ + public void removeFluid(@Nullable Liquid liquid, float amount, PressureConfig reference) { + if (liquid == null) { + air -= amount; + pressure = air / reference.fluidCapacity * arbitraryPressureScalar; + } else { + liquids[liquid.id] = Mathf.maxZero(liquids[liquid.id] - amount); + pressures[liquid.id] = liquids[liquid.id] / reference.fluidCapacity * arbitraryPressureScalar; + } + current = liquid; + } + @Override public void write(Writes write) { write.f(pressure); From 38c10cdd4153eced9cef1013f8385a3de304ee5d Mon Sep 17 00:00:00 2001 From: = Date: Wed, 4 Dec 2024 23:57:44 -0300 Subject: [PATCH 02/54] too lazy to change the bar today --- src/omaloon/world/meta/PressureConfig.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/omaloon/world/meta/PressureConfig.java b/src/omaloon/world/meta/PressureConfig.java index d20b55af..e3691cde 100644 --- a/src/omaloon/world/meta/PressureConfig.java +++ b/src/omaloon/world/meta/PressureConfig.java @@ -93,13 +93,14 @@ public void addBars(Block block) { return Core.bundle.format("bar.pressure-liquid", liquidName, - Mathf.round(build.getPressure(), 1), - Mathf.round(build.getPressure() > 0 ? build.pressureConfig().maxPressure : build.pressureConfig().minPressure, 1)); + Mathf.round(build.pressure().currentAmount(), 1), + Mathf.round(build.pressure().getPressure(build.pressure().current), 1) + ); }, () -> { HasPressure build = (HasPressure)entity; Liquid current = build.pressure().current; - return current != null && build.pressure().liquids[current.id] > 0.001f ? current.color : Color.lightGray; + return current != null ? current.color : Color.lightGray; }, () -> { HasPressure build = (HasPressure)entity; From 32300e7b25ac25fb4f64fc6caf60c00ea361eaea Mon Sep 17 00:00:00 2001 From: = Date: Thu, 5 Dec 2024 17:08:49 -0300 Subject: [PATCH 03/54] changed the bar --- assets/bundles/bundle.properties | 4 ++-- src/omaloon/world/meta/PressureConfig.java | 18 ++++++++---------- src/omaloon/world/modules/PressureModule.java | 9 +++++++++ 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/assets/bundles/bundle.properties b/assets/bundles/bundle.properties index 3642da77..02063947 100644 --- a/assets/bundles/bundle.properties +++ b/assets/bundles/bundle.properties @@ -339,8 +339,8 @@ stat.omaloon-pressurerange.format = from \uC357 @ pressure units to \uC357 @ pre ## ui units unit.omaloon-pressuresecond = pressure units / second unit.omaloon-pressureunits = pressure units -bar.air = Air -bar.pressure-liquid = {0} (\uC357 {1}/{2}) +bar.air = Air: +bar.pressure-liquid = ({0}: {1} / Air: {2}) bar.hail-shield-health = Individual Shelter omaloon-source-negative = Negative diff --git a/src/omaloon/world/meta/PressureConfig.java b/src/omaloon/world/meta/PressureConfig.java index e3691cde..395b5ff2 100644 --- a/src/omaloon/world/meta/PressureConfig.java +++ b/src/omaloon/world/meta/PressureConfig.java @@ -86,26 +86,24 @@ public void addBars(Block block) { block.addBar("pressure-liquid", (Building entity) -> new Bar( () -> { HasPressure build = (HasPressure)entity; - Liquid current = build.pressure().current; - String liquidName = (current == null || build.pressure().liquids[current.id] < 0.01f) - ? Core.bundle.get("bar.air") - : current.localizedName; + Liquid current = build.pressure().getMain(); + if (current == null) return Core.bundle.get("bar.air") + Mathf.round(build.pressure().air, 1); return Core.bundle.format("bar.pressure-liquid", - liquidName, - Mathf.round(build.pressure().currentAmount(), 1), - Mathf.round(build.pressure().getPressure(build.pressure().current), 1) + current.localizedName, + Mathf.round(build.pressure().liquids[current.id], 1), + Mathf.round(build.pressure().air, 1) ); }, () -> { HasPressure build = (HasPressure)entity; - Liquid current = build.pressure().current; + Liquid current = build.pressure().getMain(); return current != null ? current.color : Color.lightGray; }, () -> { HasPressure build = (HasPressure)entity; - Liquid current = build.pressure().current; - return current != null ? Mathf.clamp(build.pressure().currentAmount()/(build.pressure().currentAmount() + build.pressure().air)) : 0; + Liquid current = build.pressure().getMain(); + return current != null ? Mathf.clamp(build.pressure().liquids[current.id]/(build.pressure().liquids[current.id] + build.pressure().air)) : 0; } )); } diff --git a/src/omaloon/world/modules/PressureModule.java b/src/omaloon/world/modules/PressureModule.java index 11162825..ea775af7 100644 --- a/src/omaloon/world/modules/PressureModule.java +++ b/src/omaloon/world/modules/PressureModule.java @@ -35,6 +35,15 @@ public float currentAmount() { return current == null ? air : liquids[current.id]; } + public @Nullable Liquid getMain() { + Liquid out = null; + for(int i = 0; i < liquids.length; i++) { + if (out == null && liquids[i] > 0) out = Vars.content.liquid(i); + if (out != null && liquids[i] > liquids[out.id]) out = Vars.content.liquid(i); + } + return out; + } + /** * Returns the amount of pressure felt by this module from a certain liquid + the pressure of air inside this module. */ From d25cfbce998655b07f5751a15d0a28ee2ba17225 Mon Sep 17 00:00:00 2001 From: = Date: Thu, 5 Dec 2024 23:19:11 -0300 Subject: [PATCH 04/54] not fully tested gauger --- assets/bundles/bundle.properties | 4 + .../blocks/liquids/liquid-gauge-pointer.png | Bin 0 -> 161 bytes .../blocks/liquids/liquid-gauge-tiles.png | Bin 0 -> 1029 bytes .../sprites/blocks/liquids/liquid-gauge.png | Bin 0 -> 450 bytes .../content/blocks/OlDistributionBlocks.java | 13 +- src/omaloon/ui/elements/CenterBar.java | 130 ++++++++++++++ .../blocks/liquid/PressureLiquidGauge.java | 158 ++++++++++++++++++ src/omaloon/world/interfaces/HasPressure.java | 6 +- src/omaloon/world/meta/PressureSection.java | 28 ++++ src/omaloon/world/modules/PressureModule.java | 6 +- 10 files changed, 338 insertions(+), 7 deletions(-) create mode 100644 assets/sprites/blocks/liquids/liquid-gauge-pointer.png create mode 100644 assets/sprites/blocks/liquids/liquid-gauge-tiles.png create mode 100644 assets/sprites/blocks/liquids/liquid-gauge.png create mode 100644 src/omaloon/ui/elements/CenterBar.java create mode 100644 src/omaloon/world/blocks/liquid/PressureLiquidGauge.java create mode 100644 src/omaloon/world/meta/PressureSection.java diff --git a/assets/bundles/bundle.properties b/assets/bundles/bundle.properties index 02063947..24801afb 100644 --- a/assets/bundles/bundle.properties +++ b/assets/bundles/bundle.properties @@ -273,6 +273,9 @@ block.omaloon-liquid-junction.description = Acts as a bridge for two crossing li block.omaloon-liquid-valve.name = Liquid Valve block.omaloon-liquid-valve.description = Equalizes fluid systems pressure to -15 pressure units. Jams when the pressure decreases too fast. +block.omaloon-liquid-gauge.name = Liquid Gauge +block.omaloon-liquid-gauge.description = Displays the amount of pressure inside it. + block.omaloon-liquid-bridge.name = Liquid Bridge block.omaloon-liquid-bridge.description = Transports liquids over terrain or buildings. @@ -340,6 +343,7 @@ stat.omaloon-pressurerange.format = from \uC357 @ pressure units to \uC357 @ pre unit.omaloon-pressuresecond = pressure units / second unit.omaloon-pressureunits = pressure units bar.air = Air: +bar.pressure = Pressure: bar.pressure-liquid = ({0}: {1} / Air: {2}) bar.hail-shield-health = Individual Shelter omaloon-source-negative = Negative diff --git a/assets/sprites/blocks/liquids/liquid-gauge-pointer.png b/assets/sprites/blocks/liquids/liquid-gauge-pointer.png new file mode 100644 index 0000000000000000000000000000000000000000..7106ec85012f7eb4eb47835d7498a24ed7f4e45a GIT binary patch literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWNC>ZSN z;usRq`u2*U5Q6}ZOJL!DYxlDTGj*CD?T^|Ny+DNFK=LxaUAxP>&n$_(bU|WYu#)Wt zu5fQ3es{%(ms~n`370Uj{@c@%)v0~HAk^t^2Lr=-)5q&&_;OReo&p-r;OXk;vd$@? F2>^LdGrj-- literal 0 HcmV?d00001 diff --git a/assets/sprites/blocks/liquids/liquid-gauge-tiles.png b/assets/sprites/blocks/liquids/liquid-gauge-tiles.png new file mode 100644 index 0000000000000000000000000000000000000000..5b0474f5a2c2cc189d72053be34c290062697cd2 GIT binary patch literal 1029 zcmV+g1p51lP)$pl51oozZtkBH=r;r%vjjH< znLBp5pD^+z?c`LEN%4`CEaPwl0>q9izQ~kBKD~i5I~{-j&F|H;m)EBuy}r9>?VJN~ z`?8kv9K_JWc?x1coKM$@h=_I%JE&tz`!8r``S)7wivYL|N}XEU6A_J;&SpElo!I-2 z`@Ptg^g7rPC^`T0{_grs>T?0W>)Z=M4MK}^Pg`~x=192?^Y@Lk;o^WDfwUpgv2-te z))a*E1E_NiL}@{SV?c9mY2yaa!iMLs-^IP)_1nwcHL|o4E#J4aa1m`_1WW*s-3{F_ zRRE9sJv-zj2i$Mdbt(oX3m|;}1tB@-`b=#Rgi=H6&`JTDuPty4pfkYQb^*Y%rJ`-P zzS$A*g79qR#f32%3hHqi9BCCaJ9TehCEk zd{=(p2B0U1F8qK9pa%%3Hmqs6eqi-{ApgT%5|R`|w~S~8!N!2K_{=S&A1Ix0AbWgB zKY*NYlt6g&1H;cBzr<-M4WVb-bsgPWoD)^j4|tt>L5$HnPXd9SAwx+i=Un3lI1sRY z!0KGO7t#+{oNFM8B-M1CX#QySA@u`yL6{G@mmkQV+q8aQwD5nm_<_{SvtSkdfCof1 z{eWa>GQv4eEq~>swt~%ed^?#lBE(dRCI=C54(kWJAj0|qWcMn82Hrq{fu0A~L>tHlJ^`?WNt7Q5=?9|xKuA9j z|0AMiT&f`C^-3qL><)DIxeo9YLw&ZT=H{eZ=J1jLw55v{KK zkotix{J^&K13mZw_~5bzKj6|2ctCjd1I_pWbm?ZdW9#8G>KxJ!NDWIJd!35_ydc8* zfha!^)(=GafhzieC_iA<5A@^*h&Hend;<6f#!UMj&kPfJ00000NkvXXu0mjf{2TkWYB*C;ha%AAQ-_Ww zm+;F;LZz^lW~G&0Y}h82w3?Z$#**w1#A>-eg?*Qd>Fn0YcBj!dITLYy7>Ya;;r@bL zif|V4_SgadMmHl9a7q4^6)b$dRDMzb14x0E<^#ZW37C)N=Zf}^n?}XbmV;IxMgDy_ zRE=qvk$_tAS`k?jmXO!v($_Fl$^f_Pd8d8<_!i}ao?t$p6_AM*a;;C!Ei$2>U?tCq zNNq^;HGF=Vbbd=>yPnhK(86rOzQWx-yhbKWmDv&>?_Zs^ws8UfpaRqbehp_&(`YQ` zi}2s)Lao5KY3Rgptb#_ZG7WEtiX$+( name, Prov color, Floatp fraction) { + this.fraction = fraction; + lastValue = value = Mathf.clamp(fraction.get()); + update(() -> { + this.name = name.get(); + this.blinkColor.set(color.get()); + setColor(color.get()); + }); + } + + public CenterBar() { + + } + + public void reset(float value){ + this.value = lastValue = blink = value; + } + + public void set(Prov name, Floatp fraction, Color color){ + this.fraction = fraction; + this.lastValue = fraction.get(); + this.blinkColor.set(color); + setColor(color); + update(() -> this.name = name.get()); + } + + public void snap(){ + lastValue = value = fraction.get(); + } + + public Bar outline(Color color, float stroke){ + outlineColor.set(color); + outlineRadius = Scl.scl(stroke); + return this; + } + + public void flash(){ + blink = 1f; + } + + public Bar blink(Color color){ + blinkColor.set(color); + return this; + } + + @Override + public void draw(){ + if(fraction == null) return; + + float computed = Mathf.clamp(fraction.get(), -1f, 1f); + + + if(lastValue > computed){ + blink = 1f; + lastValue = computed; + } + + if(Float.isNaN(lastValue)) lastValue = 0; + if(Float.isInfinite(lastValue)) lastValue = 1f; + if(Float.isNaN(value)) value = 0; + if(Float.isInfinite(value)) value = 1f; + if(Float.isNaN(computed)) computed = 0; + if(Float.isInfinite(computed)) computed = 1f; + + blink = Mathf.lerpDelta(blink, 0f, 0.2f); + value = Mathf.lerpDelta(value, computed, 0.15f); + + Drawable bar = Tex.bar; + + if(outlineRadius > 0){ + Draw.color(outlineColor); + bar.draw(x - outlineRadius, y - outlineRadius, width + outlineRadius*2, height + outlineRadius*2); + } + + Draw.colorl(0.1f); + Draw.alpha(parentAlpha); + bar.draw(x, y, width, height); + Draw.color(color, blinkColor, blink); + Draw.alpha(parentAlpha); + + Drawable top = Tex.barTop; + + top.draw( + x + (width/2f - Core.atlas.find("bar-top").width/2f) * (Math.min(value, 0f) + 1f), + y, + Core.atlas.find("bar-top").width + (-Core.atlas.find("bar-top").width/2f + width/2f) * Math.abs(value), + height + ); + + Draw.color(); + + Font font = Fonts.outline; + GlyphLayout lay = Pools.obtain(GlyphLayout.class, GlyphLayout::new); + lay.setText(font, name); + + font.setColor(1f, 1f, 1f, 1f); + font.getCache().clear(); + font.getCache().addText(name, x + width / 2f - lay.width / 2f, y + height / 2f + lay.height / 2f + 1); + font.getCache().draw(parentAlpha); + + Pools.free(lay); + } +} diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidGauge.java b/src/omaloon/world/blocks/liquid/PressureLiquidGauge.java new file mode 100644 index 00000000..644e25d6 --- /dev/null +++ b/src/omaloon/world/blocks/liquid/PressureLiquidGauge.java @@ -0,0 +1,158 @@ +package omaloon.world.blocks.liquid; + +import arc.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.math.geom.*; +import arc.util.*; +import arc.util.io.*; +import mindustry.entities.units.*; +import mindustry.gen.*; +import mindustry.type.*; +import mindustry.world.blocks.liquid.*; +import mindustry.world.blocks.sandbox.*; +import omaloon.ui.elements.*; +import omaloon.world.interfaces.*; +import omaloon.world.meta.*; +import omaloon.world.modules.*; + +public class PressureLiquidGauge extends LiquidBlock { + public PressureConfig pressureConfig = new PressureConfig(); + + public Color maxColor = Color.white, minColor = Color.white; + + public TextureRegion[] tileRegions; + public TextureRegion gaugeRegion; + + public PressureLiquidGauge(String name) { + super(name); + rotate = true; + } + + @Override + public void drawPlanRegion(BuildPlan plan, Eachable list) { + var tiling = new Object() { + int tiling = 0; + }; + Point2 + front = new Point2(1, 0).rotate(plan.rotation).add(plan.x, plan.y), + back = new Point2(-1, 0).rotate(plan.rotation).add(plan.x, plan.y); + + boolean inverted = plan.rotation == 1 || plan.rotation == 2; + list.each(next -> { + if (new Point2(next.x, next.y).equals(front) && next.block.outputsLiquid) tiling.tiling |= inverted ? 2 : 1; + if (new Point2(next.x, next.y).equals(back) && next.block.outputsLiquid) tiling.tiling |= inverted ? 1 : 2; + }); + + Draw.rect(tileRegions[tiling.tiling], plan.drawx(), plan.drawy(), (plan.rotation + 1) * 90f % 180 - 90); + Draw.rect(gaugeRegion, plan.drawx(), plan.drawy()); + } + + @Override + public TextureRegion[] icons() { + return new TextureRegion[]{region}; + } + + @Override + public void load() { + super.load(); + tileRegions = Core.atlas.find(name + "-tiles").split(32, 32)[0]; + gaugeRegion = Core.atlas.find(name + "-pointer"); + } + + @Override + public void setBars() { + super.setBars(); + pressureConfig.addBars(this); + addBar("pressure", entity -> { + HasPressure build = (HasPressure)entity; + + return new CenterBar( + () -> Core.bundle.get("bar.pressure") + (build.pressure().getPressure(build.pressure().getMain()) < 0 ? "-" : "+") + Strings.autoFixed(Math.abs(build.pressure().getPressure(build.pressure().getMain())), 2), + () -> build.pressure().getPressure(build.pressure().getMain()) > 0 ? maxColor : minColor, + () -> Mathf.map(build.pressure().getPressure(build.pressure().getMain()), pressureConfig.minPressure, pressureConfig.maxPressure, -1, 1) + ); + }); + } + + @Override + public void setStats() { + super.setStats(); + pressureConfig.addStats(stats); + } + + public class PressureLiquidGaugeBuild extends LiquidBuild implements HasPressure { + PressureModule pressure = new PressureModule(); + + public int tiling; + + @Override + public boolean acceptLiquid(Building source, Liquid liquid) { + return hasLiquids; + } + + @Override + public boolean canDumpLiquid(Building to, Liquid liquid) { + return super.canDumpLiquid(to, liquid) || to instanceof LiquidVoid.LiquidVoidBuild; + } + + @Override + public boolean connects(HasPressure to) { + return HasPressure.super.connects(to) && to instanceof PressureLiquidValve.PressureLiquidValveBuild ? + (front() == to || back() == to) && (to.front() == this || to.back() == this) : + (front() == to || back() == to); + } + + @Override + public void draw() { + Draw.rect(tileRegions[tiling], x, y, tiling != 0 ? 0 : (rotdeg() + 90) % 180 - 90); + float p = Mathf.map(pressure().getPressure(pressure().getMain()), pressureConfig.minPressure, pressureConfig.maxPressure, -1, 1); + Draw.color( + Color.white, + pressure().getPressure(pressure().getMain()) > 0 ? maxColor : minColor, + p + ); + Draw.rect(gaugeRegion, x, y, rotdeg() + (p > 1 ? Mathf.randomSeed((long) Time.time, -360f, 360f) : p * 180f)); + } + + @Override + public void onProximityUpdate() { + super.onProximityUpdate(); + tiling = 0; + boolean inverted = rotation == 1 || rotation == 2; + if (front() instanceof HasPressure front && connected(front)) tiling |= inverted ? 2 : 1; + if (back() instanceof HasPressure back && connected(back)) tiling |= inverted ? 1 : 2; + } + + @Override public PressureModule pressure() { + return pressure; + } + @Override public PressureConfig pressureConfig() { + return pressureConfig; + } + + @Override + public void read(Reads read, byte revision) { + super.read(read, revision); + pressure.read(read); + } + + @Override + public void updatePressure() { + HasPressure.super.updatePressure(); + } + @Override + public void updateTile() { + updatePressure(); + nextBuilds(true).each(b -> moveLiquidPressure(b, liquids.current())); + dumpPressure(); + } + + @Override + public void write(Writes write) { + super.write(write); + pressure.write(write); + } + } +} diff --git a/src/omaloon/world/interfaces/HasPressure.java b/src/omaloon/world/interfaces/HasPressure.java index 2592a3ca..cb124469 100644 --- a/src/omaloon/world/interfaces/HasPressure.java +++ b/src/omaloon/world/interfaces/HasPressure.java @@ -178,8 +178,10 @@ default void transferPressure(HasPressure to, float pressure) { * method to update pressure related things */ default void updatePressure() { - if (Mathf.round(getPressure()) <= pressureConfig().minPressure) damage(pressureConfig().underPressureDamage); - if (Mathf.round(getPressure()) >= pressureConfig().maxPressure) damage(pressureConfig().overPressureDamage); + Vars.content.liquids().each(liquid -> { + if (Mathf.round(pressure().getPressure(liquid)) <= pressureConfig().minPressure) damage(pressureConfig().underPressureDamage); + if (Mathf.round(pressure().getPressure(liquid)) >= pressureConfig().maxPressure) damage(pressureConfig().overPressureDamage); + }); } /** diff --git a/src/omaloon/world/meta/PressureSection.java b/src/omaloon/world/meta/PressureSection.java new file mode 100644 index 00000000..baa69100 --- /dev/null +++ b/src/omaloon/world/meta/PressureSection.java @@ -0,0 +1,28 @@ +package omaloon.world.meta; + +import arc.struct.*; +import arc.util.*; +import mindustry.type.*; +import omaloon.world.interfaces.*; + +public class PressureSection { + public Seq builds = new Seq<>(); + + /** + * Adds a certain amount of a fluid into this module, updating it's pressure accordingly. A null liquid means that air is being added to it. + */ + public void addFluid(@Nullable Liquid liquid, float amount) { + if (builds.isEmpty()) return; + float div = amount/builds.size; + builds.each(b -> b.pressure().addFluid(liquid, div, b.pressureConfig())); + } + + /** + * Removes a certain amount of a fluid from this module, updating pressure accordingly. A null liquid means that air is being removed from it. Liquids cannot be negative. + */ + public void removeFluid(@Nullable Liquid liquid, float amount) { + if (builds.isEmpty()) return; + float div = amount/builds.size; + builds.each(b -> b.pressure().removeFluid(liquid, div, b.pressureConfig())); + } +} diff --git a/src/omaloon/world/modules/PressureModule.java b/src/omaloon/world/modules/PressureModule.java index ea775af7..c1d71737 100644 --- a/src/omaloon/world/modules/PressureModule.java +++ b/src/omaloon/world/modules/PressureModule.java @@ -15,6 +15,8 @@ public class PressureModule extends BlockModule { public float[] pressures = new float[Vars.content.liquids().size]; public float air = 0, pressure = 0; + public PressureSection section = new PressureSection(); + public @Nullable Liquid current; /** @@ -31,10 +33,6 @@ public void addFluid(@Nullable Liquid liquid, float amount, PressureConfig refer current = liquid; } - public float currentAmount() { - return current == null ? air : liquids[current.id]; - } - public @Nullable Liquid getMain() { Liquid out = null; for(int i = 0; i < liquids.length; i++) { From ecaee4c631204e96c67671d8825b7d6c86cd3f86 Mon Sep 17 00:00:00 2001 From: = Date: Fri, 6 Dec 2024 20:01:23 -0300 Subject: [PATCH 05/54] liquid distribution --- .../blocks/liquids/liquid-gauge-pointer.png | Bin 161 -> 162 bytes .../blocks/liquids/liquid-gauge-tiles.png | Bin 1029 -> 1015 bytes .../sprites/blocks/liquids/liquid-gauge.png | Bin 450 -> 428 bytes .../content/blocks/OlDistributionBlocks.java | 3 + .../blocks/liquid/PressureLiquidConduit.java | 44 +++++--------- .../blocks/liquid/PressureLiquidGauge.java | 7 ++- src/omaloon/world/interfaces/HasPressure.java | 45 +++++++------- src/omaloon/world/meta/PressureConfig.java | 5 +- src/omaloon/world/meta/PressureSection.java | 55 ++++++++++++++++++ 9 files changed, 103 insertions(+), 56 deletions(-) diff --git a/assets/sprites/blocks/liquids/liquid-gauge-pointer.png b/assets/sprites/blocks/liquids/liquid-gauge-pointer.png index 7106ec85012f7eb4eb47835d7498a24ed7f4e45a..bc46dd8c11f49f5a29d781c8fb8e81c1562e6429 100644 GIT binary patch delta 112 zcmV-$0FVEn0ipqrIcZc$L_t(oh3(Wq4ge4gL{WABJJ*_!#t@Cef$xIz| zckdRNNxP(>G5n;&_P{D!EwObt3J=33PG|sNY?;^uN)3K Sr3M%P0000qj{fGbn&o$$(91d+{ R^~wMM002ovPDHLkV1fhgEtUWP diff --git a/assets/sprites/blocks/liquids/liquid-gauge-tiles.png b/assets/sprites/blocks/liquids/liquid-gauge-tiles.png index 5b0474f5a2c2cc189d72053be34c290062697cd2..53dcd81cd84d3cd23fc72777d998ab303f16c529 100644 GIT binary patch delta 972 zcmV;-12g=E2=@n&Ie)21L_t(|ob6jNZX+=aFxbp ze15;(s(m(h8}Yg50S|cTGi}TT0WY|hggOU2;GVYP97vf;1E#+>(ngvGq6c_GWMJ(X z?`xWba|aZ>L_!145`*3Gfam2@PBtliOkvY7MQf)h2AZx4?4%T>;j%3j&^yinfu)7Cqo4 z;R)qqu7fo#^Q3X%IbnEKJP;A(;z3V49e2a!Xtp+q({cCzXtp+q8GJ!t4H6t&B(U~D zHAEi}2}B*yL-hfo%;A*VyvL&H`-7kt9O&0hK@m3FvIt z($e~Y)$@V$3x^~moJ3egG?VC3KVZ=l#IvCm1CSVR)f27=AU7O25>`Edh-mop`>(nT zH5YoquIuX70#4MZe!vUvB{A0Kc^V1y4jD>HC4caeJ|K~R>j$jh+Ow+q0SkDEL{_Al z&J)dlCHs=~16PwUb-7m`Nc-J%{lI9^|61t-+{~+BmHGh>iDvZ!nxV;v1kNq}$;Z+T zHrxL7V9tmTD@rsei5hUYe!xq@BlTa+0VI0mNLcj*qQnD8^s;6|rF}-!h+1Vt$R-Cb z!+#!jI_`$BSTNtBhY;Xb_^T6G)DJ{nToc_uKJZOIJeY+3e?hH2P*p!rs}FeU2b$^w zs9MggsXox8e!vUvB?0e*7JY!IvVH&o?^-`#1=pTc)el&}YeIbxjxq-dlDgiHv>iU6NeW1F2 upjIDfQa@0u518u*BJ}~H8;Awp1U>=t3G9LE+ipMr0000&CqR delta 986 zcmV<0110?T2ZacbIe)iFL_t(|ob6h%j@vK{r3?SZAwQAj#+whFid$~(pA_gf1Rb*k zHwBqHcDbK0@+Ix$RFO&Xk(4asa0CLxjx4^<ezgfigQCfB((z)wGw_ry;$*yJ+p4 z19AJZmh&9M(8GBOVnCcv*NKRTb`LwKV@vxlXlMENTJ4JfxPJ~xom$%y5sjA4W;?!} z*!z$Bz1WxZI@l2?Isfzi?)pvYa{<8X+zUbtLW^@xTXq`eNVyL4_l>mS;(#52v?0>5 zbT56@6om5wsB;ZOX+eTxKyz+s;|9>ehUc%}#l7J5+soZGva}K{-?y}I5p7@uOaPGG z4c#$S0FV1UJAdRQ2i$Mdbt(oX3m|;}1tB@-`b=#Rgi=H6&`JTDuPty4pfkYQb^*Y% zrJ`-PzS$A*g79qR#f3R1L5Td5D-oI zfl^Ia1TcfB!4GI4#A%2+;M!>MqE5p#tqVVpj%4={FvY;`VW*A)vSX$((wraAWY8>0G4K?DN1t3|8az~wWf37+|U_DEy$`4qb6IJF1(2NM0hLWRbMr0Q?fVKF{EuRh@P(hpdiYaogw)pVU`{%H0g^#gZ7m=C#^AIP8Ew0>Z;@PD=Vfz-^i zU={s<2ShdffMjSg!Z}YZf90dLg3We(JDD>g#8iqV2N7`&>j%6b!ukPZ_bP!1>j#kC z%YT{?ne_vu-OHL0LHdE7+`#307`p8R^C@~40O=9_>Hrq{fu0A~L>tHlJ^`?WNt7Q5 z=?9|xKuA9j|0AMiT&f`C^-3qL><)DIxeo9YLw&ZT=H{eZ=J z1jLw55v{KKkotix{J^&K13mZw_~5bzKU3h+4|qU$^#jfL0d(nRw`1$!H0m7E4@eD5 z9ebUN0K6c=`hh4v5Y`Vw`GG3>fha#<)(`aL2Z%PX7kmQv2gXeM9?uLDc>n+a07*qo IM6N<$f}yq5LjV8( diff --git a/assets/sprites/blocks/liquids/liquid-gauge.png b/assets/sprites/blocks/liquids/liquid-gauge.png index e8d39d91672a49818684e0fa198a21ee3e8d935e..46865391aec4e27f2191df4133d6354043b4a5c5 100644 GIT binary patch delta 380 zcmV-?0fYX+1FQp(Ie%VBL_t(og~eApb^fT~g=M1PZ9hnL-T(qzR#h zj%F{hkCTK7;qjZ@kc8_4 z+$Z4}`0{g29cFJ6Rp1=|yBr`XuoYY+U?pM69Q_3V(3~34>3>+)R6nXJ(Pwx+qLq59PzjZFPCtWF4TM)NI_~iQ&NW_(BxBx zjwYAz%Sl3|u$E?}m0oPvCYH3CnXJZ=>=49ixj%({myGG`*2#9K(Kk60aef$zJQU&n zf?SGl7V`Gk0suxgBNK2*{*@Ihe7;nEQUC);ftKb2z;y|jkALOoiuRA2M#a*WgH|9# z{(U%9jcJ&XfLiie5m^(Kkk{nW*DzGd0JrOTr+xqU7UhJVU_PJ~kck#@txwJ^GNGSf zCC`aSZAkPre14g9eoJDzp3~*f!fe96!reW*MkY*^*%BY`U!AtLaRL9J0@MS34QEf& zXe{T8@ZaY`t$)C{Y3Rgptb#_ZG7WEtiX$ z+( list) { } } - @Override - public TextureRegion[] icons() { - return new TextureRegion[]{region}; - } - @Override public void load() { super.load(); + topRegions = OlUtils.split(name + "-tiles", 32, 0); - if (!bottomRegion.found()) bottomRegion = Core.atlas.find("omaloon-liquid-bottom"); + bottomRegion = Core.atlas.find(name + "-bottom", "omaloon-liquid-bottom"); liquidRegions = new TextureRegion[2][animationFrames]; if(renderer != null){ @@ -143,15 +138,10 @@ public void setStats() { pressureConfig.addStats(stats); } - public class PressureLiquidConduitBuild extends LiquidRouterBuild implements HasPressure { + public class PressureLiquidConduitBuild extends Building implements HasPressure { public int tiling = 0; PressureModule pressure = new PressureModule(); - @Override - public boolean canDumpLiquid(Building to, Liquid liquid) { - return super.canDumpLiquid(to, liquid) || to instanceof LiquidVoid.LiquidVoidBuild; - } - @Override public boolean connects(HasPressure to) { return ( @@ -163,27 +153,23 @@ public boolean connects(HasPressure to) { @Override public void draw() { Draw.rect(bottomRegion, x, y); - if (liquids().currentAmount() > 0.01f) { - int frame = liquids.current().getAnimationFrame(); - int gas = liquids.current().gas ? 1 : 0; + Liquid main = pressure.getMain(); + if (main != null && pressure.liquids[main.id] > 0.01f) { + int frame = main.getAnimationFrame(); + int gas = main.gas ? 1 : 0; float xscl = Draw.xscl, yscl = Draw.yscl; Draw.scl(1f, 1f); - Drawf.liquid(liquidRegions[gas][frame], x, y, liquids.currentAmount()/liquidCapacity, liquids.current().color.write(Tmp.c1).a(1f)); + Drawf.liquid(liquidRegions[gas][frame], x, y, Mathf.clamp(pressure.liquids[main.id]/(pressure.liquids[main.id] + pressure.air)), main.color.write(Tmp.c1).a(1f)); Draw.scl(xscl, yscl); } Draw.rect(topRegions[tiling], x, y, tiling != 0 ? 0 : (rotdeg() + 90) % 180 - 90); } - @Override - public float moveLiquid(Building next, Liquid liquid) { - if (next instanceof HasPressure p) return moveLiquidPressure(p, liquid); - return 0f; - } - @Override public void onProximityUpdate() { super.onProximityUpdate(); + tiling = 0; for (int i = 0; i < 4; i++) { HasPressure build = nearby(i) instanceof HasPressure ? (HasPressure) nearby(i) : null; @@ -191,6 +177,8 @@ public void onProximityUpdate() { build != null && connected(build) ) tiling |= (1 << i); } + + new PressureSection().mergeFlood(this); } @Override public PressureModule pressure() { @@ -209,8 +197,6 @@ public void read(Reads read, byte revision) { @Override public void updateTile() { updatePressure(); - nextBuilds(true).each(b -> moveLiquidPressure(b, liquids.current())); - dumpPressure(); } @Override diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidGauge.java b/src/omaloon/world/blocks/liquid/PressureLiquidGauge.java index 644e25d6..e817e2df 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidGauge.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidGauge.java @@ -46,7 +46,7 @@ public void drawPlanRegion(BuildPlan plan, Eachable list) { }); Draw.rect(tileRegions[tiling.tiling], plan.drawx(), plan.drawy(), (plan.rotation + 1) * 90f % 180 - 90); - Draw.rect(gaugeRegion, plan.drawx(), plan.drawy()); + Draw.rect(gaugeRegion, plan.drawx(), plan.drawy(), plan.rotation * 90f); } @Override @@ -107,7 +107,7 @@ public boolean connects(HasPressure to) { @Override public void draw() { Draw.rect(tileRegions[tiling], x, y, tiling != 0 ? 0 : (rotdeg() + 90) % 180 - 90); - float p = Mathf.map(pressure().getPressure(pressure().getMain()), pressureConfig.minPressure, pressureConfig.maxPressure, -1, 1); + float p = Math.abs(Mathf.map(pressure().getPressure(pressure().getMain()), pressureConfig.minPressure, pressureConfig.maxPressure, -1, 1)); Draw.color( Color.white, pressure().getPressure(pressure().getMain()) > 0 ? maxColor : minColor, @@ -119,10 +119,13 @@ public void draw() { @Override public void onProximityUpdate() { super.onProximityUpdate(); + tiling = 0; boolean inverted = rotation == 1 || rotation == 2; if (front() instanceof HasPressure front && connected(front)) tiling |= inverted ? 2 : 1; if (back() instanceof HasPressure back && connected(back)) tiling |= inverted ? 1 : 2; + + new PressureSection().mergeFlood(this); } @Override public PressureModule pressure() { diff --git a/src/omaloon/world/interfaces/HasPressure.java b/src/omaloon/world/interfaces/HasPressure.java index cb124469..8386f6b3 100644 --- a/src/omaloon/world/interfaces/HasPressure.java +++ b/src/omaloon/world/interfaces/HasPressure.java @@ -21,6 +21,14 @@ public interface HasPressure extends Buildingc { default boolean acceptsPressure(HasPressure from, float pressure) { return getPressure() + pressure <= from.getPressure() - pressure; } + + /** + * Adds a certain amount of a fluid into this module through the section. + */ + default void addFluid(@Nullable Liquid liquid, float amount) { + pressure().section.addFluid(liquid, amount); + } + /** * @return true if this building can dump a certain pressure amount to some building */ @@ -54,29 +62,6 @@ default void dumpPressure() { } } - default void dumpLiquidPressure(Liquid liquid) { - int dump = cdump(); - if (liquids().get(liquid) > 0.0001f) { - if (!Vars.net.client() && Vars.state.isCampaign() && team() == Vars.state.rules.defaultTeam) { - liquid.unlock(); - } - - for(int i = 0; i < nextBuilds(true).size; ++i) { - incrementDump(nextBuilds(true).size); - HasPressure other = nextBuilds(true).get((i + dump) % nextBuilds(true).size); - other = other.getLiquidDestination(as(), liquid).as(); - if (other != null && other.block().hasLiquids && canDumpLiquid(other.as(), liquid) && other.liquids() != null) { - float ofract = other.liquids().get(liquid) / other.block().liquidCapacity; - float fract = liquids().get(liquid) / block().liquidCapacity; - if (ofract < fract) { - transferLiquid(other.as(), (fract - ofract) * block().liquidCapacity * getPressureFlow(other) / nextBuilds(true).size, liquid); - } - } - } - - } - } - /** * @return current pressure of the building */ @@ -91,6 +76,13 @@ default HasPressure getPressureDestination(HasPressure from, float pressure) { return this; } + /** + * Returns the building whose section should be the same as this build's section. + */ + default @Nullable HasPressure getSectionDestination(HasPressure from) { + return this; + } + /** * @return flow of liquids from one build to another */ @@ -164,6 +156,13 @@ default Seq nextBuilds(boolean flow) { PressureModule pressure(); PressureConfig pressureConfig(); + /** + * Removes a certain amount of a fluid into this module through the section. + */ + default void removeFluid(@Nullable Liquid liquid, float amount) { + pressure().section.removeFluid(liquid, amount); + } + /** * transfers pressure between 2 buildings taking acceptsPressure into account */ diff --git a/src/omaloon/world/meta/PressureConfig.java b/src/omaloon/world/meta/PressureConfig.java index 395b5ff2..be76c5f7 100644 --- a/src/omaloon/world/meta/PressureConfig.java +++ b/src/omaloon/world/meta/PressureConfig.java @@ -4,6 +4,7 @@ import arc.graphics.*; import arc.math.*; import arc.struct.*; +import arc.util.*; import mindustry.gen.*; import mindustry.type.*; import mindustry.ui.*; @@ -91,8 +92,8 @@ public void addBars(Block block) { if (current == null) return Core.bundle.get("bar.air") + Mathf.round(build.pressure().air, 1); return Core.bundle.format("bar.pressure-liquid", current.localizedName, - Mathf.round(build.pressure().liquids[current.id], 1), - Mathf.round(build.pressure().air, 1) + Strings.autoFixed(build.pressure().liquids[current.id], 2), + Strings.autoFixed(build.pressure().air, 2) ); }, () -> { diff --git a/src/omaloon/world/meta/PressureSection.java b/src/omaloon/world/meta/PressureSection.java index baa69100..3822d751 100644 --- a/src/omaloon/world/meta/PressureSection.java +++ b/src/omaloon/world/meta/PressureSection.java @@ -2,12 +2,27 @@ import arc.struct.*; import arc.util.*; +import mindustry.*; import mindustry.type.*; import omaloon.world.interfaces.*; public class PressureSection { public Seq builds = new Seq<>(); + /** + * Temporary seqs for use in flood. + */ + public static final Seq tmp = new Seq<>(), tmp2 = new Seq<>(); + + /** + * Adds a build to this section, and removes the build from its older section. + */ + public void addBuild(HasPressure build) { + builds.add(build); + build.pressure().section.builds.remove(build); + build.pressure().section = this; + } + /** * Adds a certain amount of a fluid into this module, updating it's pressure accordingly. A null liquid means that air is being added to it. */ @@ -17,6 +32,27 @@ public void addFluid(@Nullable Liquid liquid, float amount) { builds.each(b -> b.pressure().addFluid(liquid, div, b.pressureConfig())); } + /** + * Merges buildings to this section with floodFill. + */ + public void mergeFlood(HasPressure other) { + tmp.clear().add(other); + tmp2.clear(); + + while(!tmp.isEmpty()) { + HasPressure next = tmp.pop(); + tmp2.addUnique(next); + next.nextBuilds(false).each(b -> { + if (b.getSectionDestination(next) != null && !tmp2.contains(b.getSectionDestination(next))) { + tmp.add(b.getSectionDestination(next)); + } + }); + } + + tmp2.each(this::addBuild); + updateLiquids(); + } + /** * Removes a certain amount of a fluid from this module, updating pressure accordingly. A null liquid means that air is being removed from it. Liquids cannot be negative. */ @@ -25,4 +61,23 @@ public void removeFluid(@Nullable Liquid liquid, float amount) { float div = amount/builds.size; builds.each(b -> b.pressure().removeFluid(liquid, div, b.pressureConfig())); } + + public void updateLiquids() { + float[] liquids = new float[Vars.content.liquids().size]; + float air = 0; + + for(Liquid liquid : Vars.content.liquids()) for (HasPressure build : builds) { + liquids[liquid.id] += build.pressure().liquids[liquid.id]; + build.pressure().liquids[liquid.id] = 0; + build.pressure().pressures[liquid.id] = 0; + } + for(HasPressure build : builds) { + air += build.pressure().air; + build.pressure().air = 0; + build.pressure().pressure = 0; + } + + for(Liquid liquid : Vars.content.liquids()) addFluid(liquid, liquids[liquid.id]); + addFluid(null, air); + } } From 86162b9fef1f960134d0a60a9cf3e2026349910b Mon Sep 17 00:00:00 2001 From: = Date: Fri, 6 Dec 2024 20:12:01 -0300 Subject: [PATCH 06/54] forgot --- src/omaloon/world/blocks/liquid/PressureLiquidConduit.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidConduit.java b/src/omaloon/world/blocks/liquid/PressureLiquidConduit.java index f1000926..12f0474f 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidConduit.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidConduit.java @@ -39,6 +39,8 @@ public class PressureLiquidConduit extends Block { public PressureLiquidConduit(String name) { super(name); rotate = true; + destructible = true; + update = true; } @Override From 80ef75114eb54edf0e7dffca8659234e4ddcd683 Mon Sep 17 00:00:00 2001 From: = Date: Sat, 7 Dec 2024 19:36:19 -0300 Subject: [PATCH 07/54] pump --- .../content/blocks/OlDistributionBlocks.java | 2 +- .../blocks/liquid/PressureLiquidConduit.java | 10 ++ .../blocks/liquid/PressureLiquidGauge.java | 34 ++--- .../blocks/liquid/PressureLiquidPump.java | 132 ++++++++++-------- src/omaloon/world/interfaces/HasPressure.java | 123 +++++++--------- src/omaloon/world/meta/PressureConfig.java | 8 +- 6 files changed, 155 insertions(+), 154 deletions(-) diff --git a/src/omaloon/content/blocks/OlDistributionBlocks.java b/src/omaloon/content/blocks/OlDistributionBlocks.java index 79e77252..d7d35b95 100644 --- a/src/omaloon/content/blocks/OlDistributionBlocks.java +++ b/src/omaloon/content/blocks/OlDistributionBlocks.java @@ -130,7 +130,7 @@ public static void load() { OlItems.cobalt, 20 ); pressureTransfer = 0.1f; - pressureDifference = 5f; + pressureDifference = 20f; }}; liquidValve = new PressureLiquidValve("liquid-valve") {{ diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidConduit.java b/src/omaloon/world/blocks/liquid/PressureLiquidConduit.java index 12f0474f..540a3062 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidConduit.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidConduit.java @@ -144,6 +144,11 @@ public class PressureLiquidConduitBuild extends Building implements HasPressure public int tiling = 0; PressureModule pressure = new PressureModule(); + @Override + public boolean acceptsPressurizedFluid(HasPressure from, @Nullable Liquid liquid, float amount) { + return HasPressure.super.acceptsPressurizedFluid(from, liquid, amount) && (liquid == pressure.getMain() || liquid == null || pressure.getMain() == null || from.pressure().getMain() == null); + } + @Override public boolean connects(HasPressure to) { return ( @@ -183,6 +188,11 @@ public void onProximityUpdate() { new PressureSection().mergeFlood(this); } + @Override + public boolean outputsPressurizedFluid(HasPressure to, Liquid liquid, float amount) { + return HasPressure.super.outputsPressurizedFluid(to, liquid, amount) && (liquid == to.pressure().getMain() || liquid == null || pressure.getMain() == null || to.pressure().getMain() == null); + } + @Override public PressureModule pressure() { return pressure; } diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidGauge.java b/src/omaloon/world/blocks/liquid/PressureLiquidGauge.java index e817e2df..5a02505c 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidGauge.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidGauge.java @@ -9,15 +9,13 @@ import arc.util.io.*; import mindustry.entities.units.*; import mindustry.gen.*; -import mindustry.type.*; -import mindustry.world.blocks.liquid.*; -import mindustry.world.blocks.sandbox.*; +import mindustry.world.*; import omaloon.ui.elements.*; import omaloon.world.interfaces.*; import omaloon.world.meta.*; import omaloon.world.modules.*; -public class PressureLiquidGauge extends LiquidBlock { +public class PressureLiquidGauge extends Block { public PressureConfig pressureConfig = new PressureConfig(); public Color maxColor = Color.white, minColor = Color.white; @@ -28,6 +26,8 @@ public class PressureLiquidGauge extends LiquidBlock { public PressureLiquidGauge(String name) { super(name); rotate = true; + update = true; + destructible = true; } @Override @@ -82,21 +82,11 @@ public void setStats() { pressureConfig.addStats(stats); } - public class PressureLiquidGaugeBuild extends LiquidBuild implements HasPressure { + public class PressureLiquidGaugeBuild extends Building implements HasPressure { PressureModule pressure = new PressureModule(); public int tiling; - @Override - public boolean acceptLiquid(Building source, Liquid liquid) { - return hasLiquids; - } - - @Override - public boolean canDumpLiquid(Building to, Liquid liquid) { - return super.canDumpLiquid(to, liquid) || to instanceof LiquidVoid.LiquidVoidBuild; - } - @Override public boolean connects(HasPressure to) { return HasPressure.super.connects(to) && to instanceof PressureLiquidValve.PressureLiquidValveBuild ? @@ -106,14 +96,14 @@ public boolean connects(HasPressure to) { @Override public void draw() { - Draw.rect(tileRegions[tiling], x, y, tiling != 0 ? 0 : (rotdeg() + 90) % 180 - 90); - float p = Math.abs(Mathf.map(pressure().getPressure(pressure().getMain()), pressureConfig.minPressure, pressureConfig.maxPressure, -1, 1)); + Draw.rect(tileRegions[tiling], x, y, tiling == 0 ? 0 : (rotdeg() + 90) % 180 - 90); + float p = Mathf.map(pressure().getPressure(pressure().getMain()), pressureConfig.minPressure, pressureConfig.maxPressure, -1, 1); Draw.color( Color.white, pressure().getPressure(pressure().getMain()) > 0 ? maxColor : minColor, - p + Math.abs(p) ); - Draw.rect(gaugeRegion, x, y, rotdeg() + (p > 1 ? Mathf.randomSeed((long) Time.time, -360f, 360f) : p * 180f)); + Draw.rect(gaugeRegion, x, y, rotdeg() + (Math.abs(p) > 1 ? Mathf.randomSeed((long) Time.time, -360f, 360f) : p * 180f)); } @Override @@ -141,15 +131,9 @@ public void read(Reads read, byte revision) { pressure.read(read); } - @Override - public void updatePressure() { - HasPressure.super.updatePressure(); - } @Override public void updateTile() { updatePressure(); - nextBuilds(true).each(b -> moveLiquidPressure(b, liquids.current())); - dumpPressure(); } @Override diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidPump.java b/src/omaloon/world/blocks/liquid/PressureLiquidPump.java index c4fcf495..ac2ce03a 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidPump.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidPump.java @@ -1,20 +1,22 @@ package omaloon.world.blocks.liquid; import arc.*; +import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; +import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; import arc.util.io.*; +import mindustry.*; import mindustry.content.*; -import mindustry.entities.*; import mindustry.entities.units.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; -import mindustry.world.blocks.liquid.*; -import omaloon.content.*; +import mindustry.world.*; +import mindustry.world.blocks.*; import omaloon.utils.*; import omaloon.world.interfaces.*; import omaloon.world.meta.*; @@ -23,25 +25,29 @@ import static mindustry.Vars.*; import static mindustry.type.Liquid.*; -public class PressureLiquidPump extends LiquidBlock { +public class PressureLiquidPump extends Block { public PressureConfig pressureConfig = new PressureConfig(); public float pressureTransfer = 0.1f; public float pressureDifference = 10; - public Effect pumpEffectForward = OlFx.pumpFront, pumpEffectBackward = OlFx.pumpBack; - public float pumpEffectInterval = 15f; - public float liquidPadding = 3f; public TextureRegion[][] liquidRegions; public TextureRegion[] tiles; - public TextureRegion arrowRegion; + public TextureRegion arrowRegion, topRegion, bottomRegion; public PressureLiquidPump(String name) { super(name); rotate = true; + destructible = true; + update = true; + configurable = true; + saveConfig = copyConfig = true; + config(Liquid.class, (PressureLiquidPumpBuild build, Liquid liquid) -> { + build.filter = liquid.id; + }); } @Override @@ -76,7 +82,8 @@ public void load() { super.load(); tiles = OlUtils.split(name + "-tiles", 32, 0); arrowRegion = Core.atlas.find(name + "-arrow"); - if (!bottomRegion.found()) bottomRegion = Core.atlas.find("omaloon-liquid-bottom"); + topRegion = Core.atlas.find(name + "-top"); + bottomRegion = Core.atlas.find(name + "-bottom", "omaloon-liquid-bottom"); liquidRegions = new TextureRegion[2][animationFrames]; if(renderer != null){ @@ -106,18 +113,16 @@ public void setStats() { stats.add(OlStats.pressureFlow, Mathf.round(pressureTransfer * 60f, 2), OlStats.pressureSecond); } - public class PressureLiquidPumpBuild extends LiquidBuild implements HasPressure { + public class PressureLiquidPumpBuild extends Building implements HasPressure { PressureModule pressure = new PressureModule(); public int tiling; - public float effectInterval; + public int filter = -1; - @Override public boolean acceptLiquid(Building source, Liquid liquid) { - return false; - } - @Override public boolean acceptsPressure(HasPressure from, float pressure) { - return false; + @Override + public void buildConfiguration(Table table) { + ItemSelection.buildTable(table, Vars.content.liquids(), () -> Vars.content.liquid(filter), other -> filter = other == null ? -1 : other.id); } @Override public boolean connects(HasPressure to) { @@ -129,22 +134,46 @@ public void draw() { float rot = rotate ? (90 + rotdeg()) % 180 - 90 : 0; if (tiling != 0) { Draw.rect(bottomRegion, x, y, rotdeg()); - if (liquids().currentAmount() > 0.01f) { - HasPressure front = (front() instanceof HasPressure b && connected(b)) ? b : null; - HasPressure back = (back() instanceof HasPressure b && connected(b)) ? b : null; + + HasPressure front = (front() instanceof HasPressure b && connected(b)) ? b : null; + HasPressure back = (back() instanceof HasPressure b && connected(b)) ? b : null; + + if ( + (front != null && front.pressure().getMain() != null) || + (back != null && back.pressure().getMain() != null) + ) { + + Color tmpColor = Tmp.c1; + if (front != null && front.pressure().getMain() != null) { + tmpColor.set(front.pressure().getMain().color); + } else if (back != null && back.pressure().getMain() != null) { + tmpColor.set(back.pressure().getMain().color); + } + + if ( + front != null && front.pressure().getMain() != null && + back != null && back.pressure().getMain() != null + ) tmpColor.lerp(back.pressure().getMain().color, 0.5f); + + float alpha = - (front == null ? 0 : front.liquids().currentAmount()/front.block().liquidCapacity) + - (back == null ? 0 : back.liquids().currentAmount()/back.block().liquidCapacity); + (front != null && front.pressure().getMain() != null ? Mathf.clamp(front.pressure().liquids[front.pressure().getMain().id]/(front.pressure().liquids[front.pressure().getMain().id] + front.pressure().air)) : 0) + + (back != null && back.pressure().getMain() != null ? Mathf.clamp(back.pressure().liquids[back.pressure().getMain().id]/(back.pressure().liquids[back.pressure().getMain().id] + back.pressure().air)) : 0); alpha /= ((front == null ? 0 : 1f) + (back == null ? 0 : 1f)); - int frame = liquids.current().getAnimationFrame(); - int gas = liquids.current().gas ? 1 : 0; + Liquid drawLiquid = Liquids.water; + if (front != null && front.pressure().getMain() != null) { + drawLiquid = front.pressure().getMain(); + } else if (back != null && back.pressure().getMain() != null) { + drawLiquid = back.pressure().getMain(); + } + + int frame = drawLiquid.getAnimationFrame(); + int gas = drawLiquid.gas ? 1 : 0; float xscl = Draw.xscl, yscl = Draw.yscl; Draw.scl(1f, 1f); - Drawf.liquid(liquidRegions[gas][frame], x, y, alpha, - front == null ? back == null ? Liquids.water.color : back.liquids().current().color : front.liquids().current().color - ); + Drawf.liquid(liquidRegions[gas][frame], x, y, alpha, tmpColor); Draw.scl(xscl, yscl); } Draw.rect(arrowRegion, x, y, rotdeg()); @@ -153,6 +182,11 @@ public void draw() { if (tiling == 0) Draw.rect(topRegion, x, y, rotdeg()); } + @Override + public HasPressure getSectionDestination(HasPressure from) { + return null; + } + @Override public Seq nextBuilds(boolean flow) { return Seq.with(); @@ -161,10 +195,13 @@ public Seq nextBuilds(boolean flow) { @Override public void onProximityUpdate() { super.onProximityUpdate(); + tiling = 0; boolean inverted = rotation == 1 || rotation == 2; if (front() instanceof HasPressure front && connected(front)) tiling |= inverted ? 2 : 1; if (back() instanceof HasPressure back && connected(back)) tiling |= inverted ? 1 : 2; + + new PressureSection().mergeFlood(this); } @Override public PressureModule pressure() { @@ -178,6 +215,7 @@ public void onProximityUpdate() { public void read(Reads read, byte revision) { super.read(read, revision); pressure.read(read); + filter = read.i(); } @Override @@ -186,37 +224,18 @@ public void updateTile() { if (efficiency > 0) { HasPressure front = (front() instanceof HasPressure b && connected(b)) ? b : null; HasPressure back = (back() instanceof HasPressure b && connected(b)) ? b : null; - boolean pumped = false; - - float solid = 1; - if (front == null && front() != null || back == null && back() != null) solid++; - - float difference = (front == null ? 0 : front.getPressure()) - (back == null ? 0 : back.getPressure()); - if (difference < pressureDifference/solid) { - if (front != null) front.handlePressure(pressureTransfer * edelta()); - if (back != null) back.removePressure(pressureTransfer * edelta()); - pumped = true; - } else if (back != null && front == null && front() == null) { - back.removePressure(pressureTransfer * edelta()); - pumped = true; - } - - if (pumped) effectInterval += delta(); - if (effectInterval > pumpEffectInterval) { - if (front() == null) pumpEffectForward.at(x, y, rotdeg()); - if (back() == null) pumpEffectBackward.at(x, y, rotdeg() + 180f); - effectInterval = 0f; - } - if (back != null) { - if (front != null) { - back.moveLiquidPressure(front, back.liquids().current()); - } else { - if (front() == null) { - float leakAmount = back.liquids().get(back.liquids().current()) / 1.5f; - Puddles.deposit(tile.nearby(rotation), tile, back.liquids().current(), leakAmount, true, true); - back.liquids().remove(back.liquids().current(), leakAmount); - } + if (front != null && back != null) { + Liquid pumpLiquid = Vars.content.liquid(filter); + float frontPressure = front.pressure().getPressure(pumpLiquid), backPressure = back.pressure().getPressure(pumpLiquid); + float flow = pressureTransfer * (backPressure - frontPressure + pressureDifference); + 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); } } } @@ -226,6 +245,7 @@ public void updateTile() { public void write(Writes write) { super.write(write); pressure.write(write); + write.i(filter); } } } diff --git a/src/omaloon/world/interfaces/HasPressure.java b/src/omaloon/world/interfaces/HasPressure.java index 8386f6b3..be4796e4 100644 --- a/src/omaloon/world/interfaces/HasPressure.java +++ b/src/omaloon/world/interfaces/HasPressure.java @@ -4,7 +4,6 @@ import arc.struct.*; import arc.util.*; import mindustry.*; -import mindustry.content.*; import mindustry.gen.*; import mindustry.type.*; import omaloon.world.meta.*; @@ -22,6 +21,10 @@ default boolean acceptsPressure(HasPressure from, float pressure) { return getPressure() + pressure <= from.getPressure() - pressure; } + default boolean acceptsPressurizedFluid(HasPressure from, @Nullable Liquid liquid, float amount) { + return pressureConfig().acceptsPressure; + } + /** * Adds a certain amount of a fluid into this module through the section. */ @@ -29,13 +32,6 @@ default void addFluid(@Nullable Liquid liquid, float amount) { pressure().section.addFluid(liquid, amount); } - /** - * @return true if this building can dump a certain pressure amount to some building - */ - default boolean canDumpPressure(HasPressure to, float pressure) { - return to.getPressure() + pressure <= getPressure() - pressure; - } - /** * @return true if both buildings are connected to eachother */ @@ -53,13 +49,13 @@ default boolean connects(HasPressure to) { * dumps pressure onto available builds */ default void dumpPressure() { - for (HasPressure other : nextBuilds(true)) { - float diff = (getPressure() - other.getPressure()) / 2f; - if (other.getPressure() > getPressure()) diff *= -1f; - if (canDumpPressure(other, diff)) { - transferPressure(other, diff); - } - } +// for (HasPressure other : nextBuilds(true)) { +// float diff = (getPressure() - other.getPressure()) / 2f; +// if (other.getPressure() > getPressure()) diff *= -1f; +// if (canDumpPressure(other, diff)) { +// transferPressure(other, diff); +// } +// } } /** @@ -83,15 +79,6 @@ default HasPressure getPressureDestination(HasPressure from, float pressure) { return this; } - /** - * @return flow of liquids from one build to another - */ - default float getPressureFlow(HasPressure to) { - //ensures that the liquid flows properly - if (to.getPressure() == 0) return 1f; - return Math.max(getPressure()/to.getPressure(), 1f); - } - /** * adds pressure not taking anything into account */ @@ -100,43 +87,43 @@ default void handlePressure(float pressure) { } default float moveLiquidPressure(HasPressure next, Liquid liquid) { - if (next != null) { - next = (HasPressure) next.getLiquidDestination(as(), liquid); - if (next.team() == team() && next.block().hasLiquids && liquids().get(liquid) > 0f) { - float ofract = next.liquids().get(liquid) / next.block().liquidCapacity; - float fract = liquids().get(liquid) / block().liquidCapacity; - float flow = Math.min(Mathf.clamp(fract - ofract) * block().liquidCapacity, liquids().get(liquid)) * getPressureFlow(next); - flow = Math.min(flow, next.block().liquidCapacity - next.liquids().get(liquid))/2; - if (flow > 0f && ofract <= fract && next.acceptLiquid(this.as(), liquid)) { - next.handleLiquid(this.as(), liquid, flow); - liquids().remove(liquid, flow); - return flow; - } - - if (!next.block().consumesLiquid(liquid) && next.liquids().currentAmount() / next.block().liquidCapacity > 0.1F && fract > 0.1F) { - float fx = (x() + next.x()) / 2f; - float fy = (y() + next.y()) / 2f; - Liquid other = next.liquids().current(); - if (other.blockReactive && liquid.blockReactive) { - if ((!(other.flammability > 0.3F) || !(liquid.temperature > 0.7F)) && (!(liquid.flammability > 0.3F) || !(other.temperature > 0.7F))) { - 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)); - if (Mathf.chanceDelta(0.20000000298023224)) { - Fx.steam.at(fx, fy); - } - } - } else { - this.damageContinuous(1.0F); - next.damageContinuous(1.0F); - if (Mathf.chanceDelta(0.1)) { - Fx.fire.at(fx, fy); - } - } - } - } - } - - } +// if (next != null) { +// next = (HasPressure) next.getLiquidDestination(as(), liquid); +// if (next.team() == team() && next.block().hasLiquids && liquids().get(liquid) > 0f) { +// float ofract = next.liquids().get(liquid) / next.block().liquidCapacity; +// float fract = liquids().get(liquid) / block().liquidCapacity; +// float flow = Math.min(Mathf.clamp(fract - ofract) * block().liquidCapacity, liquids().get(liquid)) * getPressureFlow(next); +// flow = Math.min(flow, next.block().liquidCapacity - next.liquids().get(liquid))/2; +// if (flow > 0f && ofract <= fract && next.acceptLiquid(this.as(), liquid)) { +// next.handleLiquid(this.as(), liquid, flow); +// liquids().remove(liquid, flow); +// return flow; +// } +// +// if (!next.block().consumesLiquid(liquid) && next.liquids().currentAmount() / next.block().liquidCapacity > 0.1F && fract > 0.1F) { +// float fx = (x() + next.x()) / 2f; +// float fy = (y() + next.y()) / 2f; +// Liquid other = next.liquids().current(); +// if (other.blockReactive && liquid.blockReactive) { +// if ((!(other.flammability > 0.3F) || !(liquid.temperature > 0.7F)) && (!(liquid.flammability > 0.3F) || !(other.temperature > 0.7F))) { +// 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)); +// if (Mathf.chanceDelta(0.20000000298023224)) { +// Fx.steam.at(fx, fy); +// } +// } +// } else { +// this.damageContinuous(1.0F); +// next.damageContinuous(1.0F); +// if (Mathf.chanceDelta(0.1)) { +// Fx.fire.at(fx, fy); +// } +// } +// } +// } +// } +// +// } return 0.0F; } @@ -153,6 +140,10 @@ default Seq nextBuilds(boolean flow) { ); } + default boolean outputsPressurizedFluid(HasPressure to, @Nullable Liquid liquid, float amount) { + return pressureConfig().outputsPressure; + } + PressureModule pressure(); PressureConfig pressureConfig(); @@ -163,16 +154,6 @@ default void removeFluid(@Nullable Liquid liquid, float amount) { pressure().section.removeFluid(liquid, amount); } - /** - * transfers pressure between 2 buildings taking acceptsPressure into account - */ - default void transferPressure(HasPressure to, float pressure) { - if (to.acceptsPressure(this, pressure)) { - removePressure(pressure); - to.handlePressure(pressure); - } - } - /** * method to update pressure related things */ diff --git a/src/omaloon/world/meta/PressureConfig.java b/src/omaloon/world/meta/PressureConfig.java index be76c5f7..18cf7794 100644 --- a/src/omaloon/world/meta/PressureConfig.java +++ b/src/omaloon/world/meta/PressureConfig.java @@ -14,7 +14,13 @@ import omaloon.world.interfaces.*; public class PressureConfig { + /** + * If true, this block's section will be able to receive fluids. + */ public boolean acceptsPressure = true; + /** + * If true, this block's section will be able to output fluids. + */ public boolean outputsPressure = true; /** * Determines whether linkList will function as a whitelist @@ -89,7 +95,7 @@ public void addBars(Block block) { HasPressure build = (HasPressure)entity; Liquid current = build.pressure().getMain(); - if (current == null) return Core.bundle.get("bar.air") + Mathf.round(build.pressure().air, 1); + if (current == null) return Core.bundle.get("bar.air") + Strings.autoFixed(build.pressure().air, 2); return Core.bundle.format("bar.pressure-liquid", current.localizedName, Strings.autoFixed(build.pressure().liquids[current.id], 2), From 70ca75cee5b08075290d8c3ff73405e83c612c89 Mon Sep 17 00:00:00 2001 From: = Date: Sun, 8 Dec 2024 22:33:59 -0300 Subject: [PATCH 08/54] valve and a few fixes --- .../blocks/liquid/PressureLiquidGauge.java | 13 +++- .../blocks/liquid/PressureLiquidPump.java | 2 +- .../blocks/liquid/PressureLiquidValve.java | 74 +++++++++++-------- src/omaloon/world/interfaces/HasPressure.java | 4 +- 4 files changed, 59 insertions(+), 34 deletions(-) diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidGauge.java b/src/omaloon/world/blocks/liquid/PressureLiquidGauge.java index 5a02505c..ded57fa3 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidGauge.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidGauge.java @@ -9,6 +9,7 @@ import arc.util.io.*; import mindustry.entities.units.*; import mindustry.gen.*; +import mindustry.type.*; import mindustry.world.*; import omaloon.ui.elements.*; import omaloon.world.interfaces.*; @@ -87,6 +88,11 @@ public class PressureLiquidGaugeBuild extends Building implements HasPressure { public int tiling; + @Override + public boolean acceptsPressurizedFluid(HasPressure from, @Nullable Liquid liquid, float amount) { + return HasPressure.super.acceptsPressurizedFluid(from, liquid, amount) && (liquid == pressure.getMain() || liquid == null || pressure.getMain() == null || from.pressure().getMain() == null); + } + @Override public boolean connects(HasPressure to) { return HasPressure.super.connects(to) && to instanceof PressureLiquidValve.PressureLiquidValveBuild ? @@ -103,7 +109,7 @@ public void draw() { pressure().getPressure(pressure().getMain()) > 0 ? maxColor : minColor, Math.abs(p) ); - Draw.rect(gaugeRegion, x, y, rotdeg() + (Math.abs(p) > 1 ? Mathf.randomSeed((long) Time.time, -360f, 360f) : p * 180f)); + Draw.rect(gaugeRegion, x, y, (rotdeg() + 90) % 180 - 90 + (Math.abs(p) > 1 ? Mathf.randomSeed((long) Time.time, -360f, 360f) : p * 180f)); } @Override @@ -118,6 +124,11 @@ public void onProximityUpdate() { new PressureSection().mergeFlood(this); } + @Override + public boolean outputsPressurizedFluid(HasPressure to, Liquid liquid, float amount) { + return HasPressure.super.outputsPressurizedFluid(to, liquid, amount) && (liquid == to.pressure().getMain() || liquid == null || pressure.getMain() == null || to.pressure().getMain() == null); + } + @Override public PressureModule pressure() { return pressure; } diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidPump.java b/src/omaloon/world/blocks/liquid/PressureLiquidPump.java index ac2ce03a..ecdc3200 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidPump.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidPump.java @@ -226,7 +226,7 @@ public void updateTile() { HasPressure back = (back() instanceof HasPressure b && connected(b)) ? b : null; if (front != null && back != null) { - Liquid pumpLiquid = Vars.content.liquid(filter); + Liquid pumpLiquid = configurable ? Vars.content.liquid(filter) : back.pressure().getMain(); float frontPressure = front.pressure().getPressure(pumpLiquid), backPressure = back.pressure().getPressure(pumpLiquid); float flow = pressureTransfer * (backPressure - frontPressure + pressureDifference); if (pumpLiquid != null) flow = Mathf.clamp(flow, -front.pressure().liquids[pumpLiquid.id], back.pressure().liquids[pumpLiquid.id]); diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidValve.java b/src/omaloon/world/blocks/liquid/PressureLiquidValve.java index 27e78ca2..bc96b85b 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidValve.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidValve.java @@ -13,8 +13,7 @@ import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; -import mindustry.world.blocks.liquid.*; -import mindustry.world.blocks.sandbox.*; +import mindustry.world.*; import omaloon.content.*; import omaloon.utils.*; import omaloon.world.interfaces.*; @@ -24,23 +23,25 @@ import static mindustry.Vars.*; import static mindustry.type.Liquid.*; -public class PressureLiquidValve extends LiquidBlock { +public class PressureLiquidValve extends Block { public PressureConfig pressureConfig = new PressureConfig(); public TextureRegion[] tiles; public TextureRegion[][] liquidRegions; - public TextureRegion valveRegion, topRegion; + public TextureRegion valveRegion, topRegion, bottomRegion; + public Effect jamEffect = Fx.explosion; public Sound jamSound = OlSounds.jam; public Effect pumpingEffect = OlFx.pumpBack; - public Effect jamEffect = Fx.explosion; public float pumpingEffectInterval = 15; public float pressureLoss = 0.05f; + public float minPressureLoss = 0.05f; public float openMin = -15f; - public float jamPoint = -20f; + public float openMax = 15f; + public float jamPoint = -45f; public float liquidPadding = 3f; @@ -81,7 +82,7 @@ public void load() { tiles = OlUtils.split(name + "-tiles", 32, 0); valveRegion = Core.atlas.find(name + "-valve"); topRegion = Core.atlas.find(name + "-top"); - if (!bottomRegion.found()) bottomRegion = Core.atlas.find("omaloon-liquid-bottom"); + bottomRegion = Core.atlas.find(name + "-top", "omaloon-liquid-bottom"); liquidRegions = new TextureRegion[2][animationFrames]; if(renderer != null){ @@ -117,7 +118,7 @@ public void setStats() { stats.add(OlStats.pressureFlow, Mathf.round(pressureLoss * 60f, 2), OlStats.pressureSecond); } - public class PressureLiquidValveBuild extends LiquidBuild implements HasPressure { + public class PressureLiquidValveBuild extends Building implements HasPressure { PressureModule pressure = new PressureModule(); public float draining; @@ -127,13 +128,8 @@ public class PressureLiquidValveBuild extends LiquidBuild implements HasPressure public boolean jammed; @Override - public boolean acceptLiquid(Building source, Liquid liquid) { - return hasLiquids; - } - - @Override - public boolean canDumpLiquid(Building to, Liquid liquid) { - return super.canDumpLiquid(to, liquid) || to instanceof LiquidVoid.LiquidVoidBuild; + public boolean acceptsPressurizedFluid(HasPressure from, @Nullable Liquid liquid, float amount) { + return HasPressure.super.acceptsPressurizedFluid(from, liquid, amount) && (liquid == pressure.getMain() || liquid == null || pressure.getMain() == null || from.pressure().getMain() == null); } @Override @@ -147,13 +143,14 @@ public boolean connects(HasPressure to) { public void draw() { float rot = rotate ? (90 + rotdeg()) % 180 - 90 : 0; Draw.rect(bottomRegion, x, y, rotation); - if (liquids().currentAmount() > 0.01f) { - int frame = liquids.current().getAnimationFrame(); - int gas = liquids.current().gas ? 1 : 0; + Liquid main = pressure.getMain(); + if (main != null && pressure.liquids[main.id] > 0.01f) { + int frame = main.getAnimationFrame(); + int gas = main.gas ? 1 : 0; float xscl = Draw.xscl, yscl = Draw.yscl; Draw.scl(1f, 1f); - Drawf.liquid(liquidRegions[gas][frame], x, y, liquids.currentAmount()/liquidCapacity, liquids.current().color.write(Tmp.c1).a(1f)); + Drawf.liquid(liquidRegions[gas][frame], x, y, Mathf.clamp(pressure.liquids[main.id]/(pressure.liquids[main.id] + pressure.air)), main.color.write(Tmp.c1).a(1f)); Draw.scl(xscl, yscl); } Draw.rect(tiles[tiling], x, y, rot); @@ -164,10 +161,18 @@ public void draw() { @Override public void onProximityUpdate() { super.onProximityUpdate(); + tiling = 0; boolean inverted = rotation == 1 || rotation == 2; if (front() instanceof HasPressure front && connected(front)) tiling |= inverted ? 2 : 1; if (back() instanceof HasPressure back && connected(back)) tiling |= inverted ? 1 : 2; + + new PressureSection().mergeFlood(this); + } + + @Override + public boolean outputsPressurizedFluid(HasPressure to, Liquid liquid, float amount) { + return HasPressure.super.outputsPressurizedFluid(to, liquid, amount) && (liquid == to.pressure().getMain() || liquid == null || pressure.getMain() == null || to.pressure().getMain() == null); } @Override public PressureModule pressure() { @@ -188,11 +193,14 @@ public void read(Reads read, byte revision) { @Override public void updatePressure() { HasPressure.super.updatePressure(); - if (getPressure() >= jamPoint) jammed = false; + + float pressureAmount = pressure.getPressure(pressure.getMain()); + + if (pressureAmount > jamPoint) jammed = false; if (jammed) return; - if (getPressure() <= openMin) { + if (pressureAmount < openMin) { effectInterval += delta(); - handlePressure(pressureLoss * Time.delta); + addFluid(null, Math.max(minPressureLoss, pressureLoss * Math.abs(pressureAmount - openMin)/10f)); draining = Mathf.approachDelta(draining, 1, 0.014f); if (effectInterval > pumpingEffectInterval) { @@ -200,10 +208,22 @@ public void updatePressure() { pumpingEffect.at(x, y, -draining * (rotation % 2 == 0 ? 90 : -90) - (rotate ? (90 - rotdeg()) % 180 - 90 : 0), liquids.current()); pumpingEffect.at(x, y, draining * (rotation % 2 == 0 ? -90 : 90) + (rotate ? (90 + rotdeg()) % 180 - 90 : 0), liquids.current()); } + }; + if (pressureAmount > openMax) { + effectInterval += delta(); + removeFluid(pressure.getMain(), Math.max(minPressureLoss, pressureLoss * Math.abs(pressureAmount - openMax)/10f)); + draining = Mathf.approachDelta(draining, 1, 0.014f); - } else draining = Mathf.approachDelta(draining, 0, 0.014f); + if (effectInterval > pumpingEffectInterval) { + effectInterval = 0; + pumpingEffect.at(x, y, -draining * (rotation % 2 == 0 ? 90 : -90) - (rotate ? (90 - rotdeg()) % 180 - 90 : 0), liquids.current()); + pumpingEffect.at(x, y, draining * (rotation % 2 == 0 ? -90 : 90) + (rotate ? (90 + rotdeg()) % 180 - 90 : 0), liquids.current()); + } + }; + + if (pressureAmount < openMin && pressureAmount > openMax) draining = Mathf.approachDelta(draining, 0, 0.014f); - if (getPressure() < jamPoint) { + if (pressureAmount < jamPoint) { jammed = true; draining = 0f; jamEffect.at(x, y, draining * (rotation%2 == 0 ? -90 : 90) + (rotate ? (90 + rotdeg()) % 180 - 90 : 0), valveRegion); @@ -213,12 +233,6 @@ public void updatePressure() { @Override public void updateTile() { updatePressure(); - nextBuilds(true).each(b -> moveLiquidPressure(b, liquids.current())); - dumpPressure(); - } - - @Override public byte version() { - return 1; } @Override diff --git a/src/omaloon/world/interfaces/HasPressure.java b/src/omaloon/world/interfaces/HasPressure.java index be4796e4..c540cc62 100644 --- a/src/omaloon/world/interfaces/HasPressure.java +++ b/src/omaloon/world/interfaces/HasPressure.java @@ -159,8 +159,8 @@ default void removeFluid(@Nullable Liquid liquid, float amount) { */ default void updatePressure() { Vars.content.liquids().each(liquid -> { - if (Mathf.round(pressure().getPressure(liquid)) <= pressureConfig().minPressure) damage(pressureConfig().underPressureDamage); - if (Mathf.round(pressure().getPressure(liquid)) >= pressureConfig().maxPressure) damage(pressureConfig().overPressureDamage); + if (Mathf.round(pressure().getPressure(liquid)) < pressureConfig().minPressure - 1) damage(pressureConfig().underPressureDamage); + if (Mathf.round(pressure().getPressure(liquid)) > pressureConfig().maxPressure + 1) damage(pressureConfig().overPressureDamage); }); } From 2ac4f87e7c3964d378752dc27d1722499c7f8b41 Mon Sep 17 00:00:00 2001 From: = Date: Tue, 10 Dec 2024 00:05:42 -0300 Subject: [PATCH 09/54] air well --- assets/bundles/bundle.properties | 3 + .../blocks/crafting/air-well-cap-from.png | Bin 0 -> 293 bytes .../blocks/crafting/air-well-cap-to.png | Bin 0 -> 296 bytes .../blocks/crafting/air-well-overlay.png | Bin 0 -> 275 bytes assets/sprites/blocks/crafting/air-well.png | Bin 0 -> 479 bytes .../content/blocks/OlProductionBlocks.java | 19 +- .../blocks/liquid/PressureLiquidJunction.java | 20 +- .../blocks/liquid/PressureLiquidPump.java | 1 - .../blocks/liquid/PressureLiquidValve.java | 2 + .../world/blocks/production/Pressurizer.java | 180 ++++++++++++++++++ 10 files changed, 212 insertions(+), 13 deletions(-) create mode 100644 assets/sprites/blocks/crafting/air-well-cap-from.png create mode 100644 assets/sprites/blocks/crafting/air-well-cap-to.png create mode 100644 assets/sprites/blocks/crafting/air-well-overlay.png create mode 100644 assets/sprites/blocks/crafting/air-well.png create mode 100644 src/omaloon/world/blocks/production/Pressurizer.java diff --git a/assets/bundles/bundle.properties b/assets/bundles/bundle.properties index 24801afb..32f0bf61 100644 --- a/assets/bundles/bundle.properties +++ b/assets/bundles/bundle.properties @@ -327,6 +327,9 @@ block.omaloon-impulse-node.description = Transmits power to connected buildings. block.omaloon-hammer-drill.name = Hammer drill block.omaloon-hammer-drill.description = When placed on ore, outputs items. Efficiency increases with decreasing pressure inside, reaching peak performance in near vacuum conditions. +block.omaloon-air-well.name = Air Well +block.omaloon-air-well.description = Constantly pulls air in or out. + ## stats category.omaloon-pressure = Pressure stat.omaloon-consumepressure = Consume Pressure diff --git a/assets/sprites/blocks/crafting/air-well-cap-from.png b/assets/sprites/blocks/crafting/air-well-cap-from.png new file mode 100644 index 0000000000000000000000000000000000000000..3607131eded34ffe0718b648f5a381eed0644eef GIT binary patch literal 293 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND0tn| z#W5tJ_3cz$zC#WoE$n(uRh?2QvlI+H4oP}kP?^&RWHq@ZRdxFM2Zc-y`j(#NE&6`) z?#bt-r+wE=kobSjg;PI#x7xPvJgeZ!m$F(j zh6h>g;h`(#uFU6PyY*?>MwLCY|9;wcWRH&hwcsSf&L@&Dg3ffUFJic7D&~3Ms@{(2 z+KQY#jhrXi4P4HNPGxlxT6p`Q1HTg6{SBw2T=q|rFzIUddcz<6%5{m;sv}jK7tBw# nI^m`9bP|K|!fDcNj12j69TV@J{20C%=tTxkS3j3^P6|;&^`NRUr1tC8D!sRwzS|Dj3Vm@gi;jcNrs%S_)IFrj)q$_oHJyLRNz;P z`s{InDS0wW%yfgc=bgL!7I-Utv(j1OcI3jbP0l+XkKuw8L$ literal 0 HcmV?d00001 diff --git a/assets/sprites/blocks/crafting/air-well-overlay.png b/assets/sprites/blocks/crafting/air-well-overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..63b7d6d51e5e68d4534b9c34a8f548b8ea4dfd9a GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND0tM< z#W5tJ_3iYHyoU?~T<70anxdua9FWE%mMA8c*fT}4$t*NwY1^p+Gd|8q{+aKte*2q# zvvq&%nuG57=H^Ek~6=;Gkvo#V}r&-{S}H6&z~^Gs5XTLP5#yq)E5d}&Gq7yHGYEh^X2RIchwzpx@LamK{fAFHL^ID50y_$5^1e%nrL UF0>ST3-l0!r>mdKI;Vst0N!tGjQ{`u literal 0 HcmV?d00001 diff --git a/assets/sprites/blocks/crafting/air-well.png b/assets/sprites/blocks/crafting/air-well.png new file mode 100644 index 0000000000000000000000000000000000000000..6baf3053916180f1a975bf1d472fbedcafbb1619 GIT binary patch literal 479 zcmV<50U-W~P)Bw(q!BQa44v9MH~5JN@RZhS&N zqJO~(Kf%IMKBDT9L~7NMfh7#c!Ex+MD&-Ca-gxo(y*r;BJDH5e#nH(zICh&Yrn5OL ztkx@aeb676d!C;bkURk3(k#brv#pTRhOR)qI8P}607!&1utaDlwN5X6NRH(C;<5mM z^Rv_1=BwL>Mgj{wOz*ERweJ)T*M?j=+=pEA1^nEEYeT+|2+PJ2k=)%s76%{eM)Iz} z!!e!BzeDhO*pEWaIVjB?eIOArz-x^2*hN7_z}s>eoKU87?FK@M&}xYqf)FCCLe{$( z4ug^UK=q=$0TL3EydvPY@Gqbg5c3i8jOfLF{ZfP)f)E*D{ibUILZ+i8q9PzhEs!Gq zP8RU4C^UGd>^QmBy><=aAQ8!AG%lo(uQh8*Ti-j<4(QS>Z)Mnq+-GCW2IXYbv|*ou zC2f6!NjVt-`ha3JtMaNXf!5=$OhyEG6K%<@HO)tw<=_KxtqzcgF57hS#Scg#z5u%z V!)v0F=^p?9002ovPDHLkV1ip*&!YeU literal 0 HcmV?d00001 diff --git a/src/omaloon/content/blocks/OlProductionBlocks.java b/src/omaloon/content/blocks/OlProductionBlocks.java index 6434d455..b0575f9b 100644 --- a/src/omaloon/content/blocks/OlProductionBlocks.java +++ b/src/omaloon/content/blocks/OlProductionBlocks.java @@ -1,8 +1,10 @@ package omaloon.content.blocks; +import arc.math.*; import mindustry.entities.effect.*; import mindustry.type.*; import mindustry.world.*; +import mindustry.world.draw.*; import omaloon.content.*; import omaloon.world.blocks.production.*; import omaloon.world.consumers.*; @@ -11,7 +13,7 @@ public class OlProductionBlocks { public static Block - hammerDrill, + hammerDrill, pressurizer, end; @@ -34,5 +36,20 @@ public static void load(){ consume(new ConsumePressure(-6, false)); consume(new PressureEfficiencyRange(-45f, -1f, 2f, true)); }}; + + pressurizer = new Pressurizer("air-well") {{ + requirements(Category.production, with( + OlItems.cobalt, 10 + )); + outputPressure = 5f; + + drawer = new DrawMulti( + new DrawDefault(), + new DrawTransition() {{ + suffix = "-cap"; + interp = a -> Interp.sine.apply(Interp.slope.apply(a)); + }} + ); + }}; } } diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidJunction.java b/src/omaloon/world/blocks/liquid/PressureLiquidJunction.java index 867b5632..b7df79a7 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidJunction.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidJunction.java @@ -3,29 +3,23 @@ import arc.struct.*; import arc.util.io.*; import mindustry.gen.*; -import mindustry.type.*; -import mindustry.world.blocks.liquid.*; +import mindustry.world.*; import omaloon.world.interfaces.*; import omaloon.world.meta.*; import omaloon.world.modules.*; -public class PressureLiquidJunction extends LiquidJunction { +public class PressureLiquidJunction extends Block { public PressureConfig pressureConfig = new PressureConfig(); public PressureLiquidJunction(String name) { super(name); + update = true; + destructible = true; } - public class PressureLiquidJunctionBuild extends LiquidJunctionBuild implements HasPressure { + public class PressureLiquidJunctionBuild extends Building implements HasPressure { PressureModule pressure = new PressureModule(); - @Override public boolean acceptLiquid(Building source, Liquid liquid) { - return false; - } - @Override public boolean acceptsPressure(HasPressure from, float pressure) { - return false; - } - @Override public boolean connects(HasPressure to) { return HasPressure.super.connects(to) && !(to instanceof PressureLiquidPump); @@ -43,6 +37,10 @@ public HasPressure getPressureDestination(HasPressure source, float pressure) { return next.getPressureDestination(this, pressure); } + @Override public HasPressure getSectionDestination(HasPressure from) { + return null; + } + @Override public Seq nextBuilds(boolean flow) { return Seq.with(); diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidPump.java b/src/omaloon/world/blocks/liquid/PressureLiquidPump.java index ecdc3200..0b33977a 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidPump.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidPump.java @@ -43,7 +43,6 @@ public PressureLiquidPump(String name) { rotate = true; destructible = true; update = true; - configurable = true; saveConfig = copyConfig = true; config(Liquid.class, (PressureLiquidPumpBuild build, Liquid liquid) -> { build.filter = liquid.id; diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidValve.java b/src/omaloon/world/blocks/liquid/PressureLiquidValve.java index bc96b85b..65c9685b 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidValve.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidValve.java @@ -48,6 +48,8 @@ public class PressureLiquidValve extends Block { public PressureLiquidValve(String name) { super(name); rotate = true; + update = true; + destructible = true; } @Override diff --git a/src/omaloon/world/blocks/production/Pressurizer.java b/src/omaloon/world/blocks/production/Pressurizer.java new file mode 100644 index 00000000..3e7a0bd1 --- /dev/null +++ b/src/omaloon/world/blocks/production/Pressurizer.java @@ -0,0 +1,180 @@ +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; + + 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); + } + } +} From 992cd800603dab092020e7cca51679d956e05bc8 Mon Sep 17 00:00:00 2001 From: = Date: Tue, 17 Dec 2024 01:11:43 -0300 Subject: [PATCH 10/54] shelter --- assets/bundles/bundle.properties | 2 + .../content/blocks/OlDefenceBlocks.java | 43 ++++--- src/omaloon/world/blocks/defense/Shelter.java | 21 +++- .../blocks/liquid/PressureLiquidValve.java | 10 +- src/omaloon/world/consumers/ConsumeFluid.java | 108 ++++++++++++++++++ src/omaloon/world/meta/OlStats.java | 35 ++++++ 6 files changed, 192 insertions(+), 27 deletions(-) create mode 100644 src/omaloon/world/consumers/ConsumeFluid.java diff --git a/assets/bundles/bundle.properties b/assets/bundles/bundle.properties index 32f0bf61..ce4c5779 100644 --- a/assets/bundles/bundle.properties +++ b/assets/bundles/bundle.properties @@ -341,6 +341,8 @@ stat.omaloon-outputpressure = Output Pressure stat.omaloon-pressureflow = Speed stat.omaloon-pressurerange = Operating Range stat.omaloon-pressurerange.format = from \uC357 @ pressure units to \uC357 @ pressure units. +stat.omaloon-optimal-pressure = Optimal Pressure +stat.omaloon-optimal-pressure.format = \uC357 @ pressure units (@%) ## ui units unit.omaloon-pressuresecond = pressure units / second diff --git a/src/omaloon/content/blocks/OlDefenceBlocks.java b/src/omaloon/content/blocks/OlDefenceBlocks.java index fbd4cc29..d6b6490d 100644 --- a/src/omaloon/content/blocks/OlDefenceBlocks.java +++ b/src/omaloon/content/blocks/OlDefenceBlocks.java @@ -48,22 +48,33 @@ public static void load(){ }}; smallShelter = new Shelter("small-shelter") {{ - requirements(Category.effect, with( - OlItems.cobalt, 25, - Items.beryllium, 30 - )); - researchCostMultiplier = 0.3f; - size = 2; - rechargeStandard = 2f; - shieldHealth = 260f; - shieldRange = 170f; - - ambientSound = OlSounds.shelter; - ambientSoundVolume = 0.08f; - - consumePower(0.2f); - consume(new ConsumePressure(0.01f, true)); - consume(new PressureEfficiencyRange(15, 50f, 1.8f, false)); + requirements(Category.effect, with( + OlItems.cobalt, 25, + Items.beryllium, 30 + )); + researchCostMultiplier = 0.3f; + size = 2; + rechargeStandard = 2f; + shieldHealth = 260f; + shieldRange = 170f; + + ambientSound = OlSounds.shelter; + ambientSoundVolume = 0.08f; + + consumePower(0.2f); + consume(new ConsumeFluid(null, 0.1f) {{ + continuous = true; + hasOptimalPressure = true; + + startRange = 15f; + endRange = 50f; + efficiencyMultiplier = 2f; + optimalPressure = 46.5f; + + curve = t -> Math.max(0f, Mathf.slope(t - 0.25f) * 2f - 1f); + }}); +// consume(new ConsumePressure(0.01f, true)); +// consume(new PressureEfficiencyRange(15, 50f, 1.8f, false)); }}; //endregion //region turrets diff --git a/src/omaloon/world/blocks/defense/Shelter.java b/src/omaloon/world/blocks/defense/Shelter.java index 5fc0611a..558a69e6 100644 --- a/src/omaloon/world/blocks/defense/Shelter.java +++ b/src/omaloon/world/blocks/defense/Shelter.java @@ -81,7 +81,6 @@ public Shelter(String name) { solid = true; configurable = true; saveConfig = true; - hasLiquids = true; group = BlockGroup.projectors; ambientSound = Sounds.shield; ambientSoundVolume = 0.08f; @@ -220,6 +219,13 @@ public boolean onConfigureTapped(float x, float y) { return false; } + @Override + public void onProximityUpdate() { + super.onProximityUpdate(); + + new PressureSection().mergeFlood(this); + } + @Override public PressureModule pressure() { return pressure; } @@ -251,12 +257,15 @@ public void updateTile() { if (broken) { warmup = Mathf.approachDelta(warmup, 0f, warmupTime); } else { - warmup = Mathf.approachDelta(warmup, efficiency, warmupTime); + warmup = Mathf.approachDelta(warmup, efficiency * efficiencyMultiplier(), warmupTime); + + float radius = shieldRange * warmup + shieldBuffer; + Groups.bullet.intersect( - x - shieldRange - shieldBuffer, - y - shieldRange - shieldBuffer, - (shieldRange + shieldBuffer) * 2f, - (shieldRange + shieldBuffer) * 2f, + x - radius, + y - radius, + radius * 2f, + radius * 2f, b -> { if (b.team == Team.derelict) { float distance = Mathf.dst(x, y, b.x, b.y); diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidValve.java b/src/omaloon/world/blocks/liquid/PressureLiquidValve.java index 65c9685b..2ad7fc4d 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidValve.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidValve.java @@ -84,7 +84,7 @@ public void load() { tiles = OlUtils.split(name + "-tiles", 32, 0); valveRegion = Core.atlas.find(name + "-valve"); topRegion = Core.atlas.find(name + "-top"); - bottomRegion = Core.atlas.find(name + "-top", "omaloon-liquid-bottom"); + bottomRegion = Core.atlas.find(name + "-bottom", "omaloon-liquid-bottom"); liquidRegions = new TextureRegion[2][animationFrames]; if(renderer != null){ @@ -207,8 +207,8 @@ public void updatePressure() { if (effectInterval > pumpingEffectInterval) { effectInterval = 0; - pumpingEffect.at(x, y, -draining * (rotation % 2 == 0 ? 90 : -90) - (rotate ? (90 - rotdeg()) % 180 - 90 : 0), liquids.current()); - pumpingEffect.at(x, y, draining * (rotation % 2 == 0 ? -90 : 90) + (rotate ? (90 + rotdeg()) % 180 - 90 : 0), liquids.current()); + pumpingEffect.at(x, y, -draining * (rotation % 2 == 0 ? 90 : -90) - (rotate ? (90 - rotdeg()) % 180 - 90 : 0), pressure.getMain()); + pumpingEffect.at(x, y, draining * (rotation % 2 == 0 ? -90 : 90) + (rotate ? (90 + rotdeg()) % 180 - 90 : 0), pressure.getMain()); } }; if (pressureAmount > openMax) { @@ -218,8 +218,8 @@ public void updatePressure() { if (effectInterval > pumpingEffectInterval) { effectInterval = 0; - pumpingEffect.at(x, y, -draining * (rotation % 2 == 0 ? 90 : -90) - (rotate ? (90 - rotdeg()) % 180 - 90 : 0), liquids.current()); - pumpingEffect.at(x, y, draining * (rotation % 2 == 0 ? -90 : 90) + (rotate ? (90 + rotdeg()) % 180 - 90 : 0), liquids.current()); + pumpingEffect.at(x, y, -draining * (rotation % 2 == 0 ? 90 : -90) - (rotate ? (90 - rotdeg()) % 180 - 90 : 0), pressure.getMain()); + pumpingEffect.at(x, y, draining * (rotation % 2 == 0 ? -90 : 90) + (rotate ? (90 + rotdeg()) % 180 - 90 : 0), pressure.getMain()); } }; diff --git a/src/omaloon/world/consumers/ConsumeFluid.java b/src/omaloon/world/consumers/ConsumeFluid.java new file mode 100644 index 00000000..0441db47 --- /dev/null +++ b/src/omaloon/world/consumers/ConsumeFluid.java @@ -0,0 +1,108 @@ +package omaloon.world.consumers; + +import arc.*; +import arc.math.*; +import arc.util.*; +import mindustry.gen.*; +import mindustry.type.*; +import mindustry.world.consumers.*; +import mindustry.world.meta.*; +import omaloon.world.interfaces.*; +import omaloon.world.meta.*; + +public class ConsumeFluid extends Consume { + /** + * Fluid used by this consumer, if null, air is used + */ + public @Nullable Liquid fluid; + /** + * Amount of fluid consumed, will always be positive if fluid isn't air. + */ + public float amount; + /** + * If true, fluid is consumed per tick and not per craft. + */ + public boolean continuous; + + /** + * Min pressure required for this consumer to function. + */ + public float startRange; + /** + * Max pressure allowed for this consumer to function. + */ + public float endRange; + /** + * Efficiency multiplier of this consumer. Based on pressure. + */ + public float efficiencyMultiplier = 1f; + /** + * Pressure whose building's efficiency is at it's peak. + */ + public float optimalPressure; + /** + * Whether to display the optimal pressure. + */ + public boolean hasOptimalPressure = false; + /** + * Interpolation curve used to determine efficiency. 0 is startRange, 1 is endRange. + */ + public Interp curve = Interp.one; + + public ConsumeFluid(@Nullable Liquid fluid, float amount) { + this.fluid = fluid; + this.amount = amount; + } + + public HasPressure cast(Building build) { + try { + return (HasPressure) build; + } catch(Exception e) { + throw new RuntimeException("This consumer should be used on a building that implements HasPressure", e); + } + } + + @Override + public void display(Stats stats) { + if (amount != 0) { + if (continuous) { + stats.add(OlStats.removeFluid, OlStats.fluid(fluid, amount, 1f, true)); + } else { + stats.add(OlStats.removeFluid, OlStats.fluid(fluid, amount, 60f, false)); + } + } + + if (startRange != endRange) { + stats.add(OlStats.pressureRange, Core.bundle.get("stat.omaloon-pressurerange.format"), Strings.autoFixed(startRange, 2), Strings.autoFixed(endRange, 2)); + if (hasOptimalPressure) stats.add(OlStats.optimalPressure, Core.bundle.get("stat.omaloon-optimal-pressure.format"), Strings.autoFixed(optimalPressure, 2), Strings.autoFixed(efficiencyMultiplier, 2)); + } + } + + @Override + public float efficiency(Building build) { + if (!shouldConsume(cast(build))) return 0f; + return 1f; + } + @Override + public float efficiencyMultiplier(Building build) { + if (!shouldConsume(cast(build))) return 0f; + return curve.apply(1f, efficiencyMultiplier, Mathf.clamp(Mathf.map(cast(build).pressure().getPressure(fluid), startRange, endRange, 0f, 1f))); + + } + + public boolean shouldConsume(HasPressure build) { + if (startRange == endRange) return true; + return startRange <= build.getPressure() && build.getPressure() <= endRange && (fluid == null || build.pressure().liquids[fluid.id] > amount); + } + + @Override public void trigger(Building build) { + if (!continuous && shouldConsume(cast(build))) { + cast(build).removeFluid(fluid, amount); + } + } + @Override public void update(Building build) { + if (continuous && shouldConsume(cast(build))) { + cast(build).removeFluid(fluid, amount * Time.delta); + } + } +} diff --git a/src/omaloon/world/meta/OlStats.java b/src/omaloon/world/meta/OlStats.java index 235fe25f..e98a6c50 100644 --- a/src/omaloon/world/meta/OlStats.java +++ b/src/omaloon/world/meta/OlStats.java @@ -1,7 +1,16 @@ package omaloon.world.meta; +import arc.*; +import arc.graphics.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.type.*; +import mindustry.ui.*; import mindustry.world.meta.*; +import static mindustry.Vars.*; + public class OlStats { public static final StatCat pressure = new StatCat("omaloon-pressure"); @@ -9,15 +18,41 @@ public class OlStats { minSpeed = new Stat("omaloon-min-speed"), maxSpeed = new Stat("omaloon-max-speed"), + addFluid = new Stat("omaloon-add-fluid", StatCat.crafting), + removeFluid = new Stat("omaloon-remove-fluid", StatCat.crafting), + pressureFlow = new Stat("omaloon-pressureflow", pressure), maxPressure = new Stat("omaloon-maxPressure", pressure), minPressure = new Stat("omaloon-minPressure", pressure), consumePressure = new Stat("omaloon-consumePressure", pressure), pressureRange = new Stat("omaloon-pressurerange", pressure), + optimalPressure = new Stat("omaloon-optimal-pressure", pressure), outputPressure = new Stat("omaloon-outputPressure", pressure); public static final StatUnit pressureUnits = new StatUnit("omaloon-pressureUnits", "\uC357"), pressureSecond = new StatUnit("omaloon-pressureSecond", "\uC357"); + + public static StatValue fluid(@Nullable Liquid liquid, float amount, float time, boolean showContinuous) { + return table -> { + table.table(display -> { + display.add(new Stack() {{ + add(new Image(liquid != null ? liquid.uiIcon : Core.atlas.find("omaloon-pressure-icon")).setScaling(Scaling.fit)); + + if (amount * 60f/time != 0) { + Table t = new Table().left().bottom(); + t.add(Strings.autoFixed(amount * 60f/time, 2)).style(Styles.outlineLabel); + add(t); + } + }}).size(iconMed).padRight(3 + (amount * 60f/time != 0 && Strings.autoFixed(amount * 60f/time, 2).length() > 2 ? 8 : 0)); + + if(showContinuous){ + display.add(StatUnit.perSecond.localized()).padLeft(2).padRight(5).color(Color.lightGray).style(Styles.outlineLabel); + } + + display.add(liquid != null ? liquid.localizedName : "@air"); + }); + }; + } } From 80bb54edef7f594d9c54ead91e4f7a584c06e37a Mon Sep 17 00:00:00 2001 From: = Date: Tue, 17 Dec 2024 17:25:25 -0300 Subject: [PATCH 11/54] valve effect fix --- src/omaloon/content/OlFx.java | 48 +++++++++++++------ .../content/blocks/OlDefenceBlocks.java | 2 +- .../blocks/liquid/PressureLiquidValve.java | 29 +++++------ src/omaloon/world/interfaces/HasPressure.java | 11 ++--- 4 files changed, 53 insertions(+), 37 deletions(-) diff --git a/src/omaloon/content/OlFx.java b/src/omaloon/content/OlFx.java index cb0d053a..228532b2 100644 --- a/src/omaloon/content/OlFx.java +++ b/src/omaloon/content/OlFx.java @@ -182,26 +182,44 @@ public class OlFx { Draw.blend(); }), - pumpFront = new Effect(60f, e -> { - Draw.alpha(e.fout() / 5f); + pumpOut = new Effect(60f, e -> { + Draw.color(e.color); + Draw.alpha(e.fout() / 5); vec.trns(e.rotation, 4f).add(e.x, e.y); - randLenVectors(e.id, 3, 16f * e.fin(), e.rotation, 10f, (x, y) -> { - Fill.circle(vec.x + x, vec.y + y, 3f * e.fin()); + Angles.randLenVectors(e.id, 3, 16 * e.fin(), e.rotation + 180, 10, (x, y) -> { + Fill.circle(vec.x + x, vec.y + y, 3 * e.fin()); + }); + vec.trns(e.rotation, -4f).add(e.x, e.y); + Angles.randLenVectors(e.id + 2, 3, 16 * e.fin(), e.rotation, 10, (x, y) -> { + Fill.circle(vec.x + x, vec.y + y, 3 * e.fin()); }); - Draw.alpha(e.fout() / 7f); - randLenVectors(e.id/2, 3, 16f * e.fin(), e.rotation, 20f, (x, y) -> { - Fill.rect(vec.x + x, vec.y + y, 5f * e.fin(), e.fin(), vec.angleTo(vec.x + x, vec.y + y)); + Draw.alpha(e.fout() / 7); + Angles.randLenVectors(e.id + 1, 3, 16 * e.fin(), e.rotation, 20, (x, y) -> { + Fill.rect(vec.x + x, vec.y + y, 5 * e.fin(), e.fin(), vec.angleTo(vec.x + x, vec.y + y)); + }); + vec.trns(e.rotation, 4f).add(e.x, e.y); + Angles.randLenVectors(e.id + 3, 3, 16 * e.fin(), e.rotation + 180, 20, (x, y) -> { + Fill.rect(vec.x + x, vec.y + y, 5 * e.fin(), e.fin(), vec.angleTo(vec.x + x, vec.y + y)); }); }), - pumpBack = new Effect(60f, e -> { - Draw.alpha(e.fin() / 5f); - vec.trns(e.rotation, 4).add(e.x, e.y); - randLenVectors(e.id, 3, 16f * e.fout(), e.rotation, 10f, (x, y) -> { - Fill.circle(vec.x + x, vec.y + y, 3f * e.fout()); + pumpIn = new Effect(60f, e -> { + Draw.color(e.color); + Draw.alpha(e.fin() / 5); + vec.trns(e.rotation, 4f).add(e.x, e.y); + Angles.randLenVectors(e.id, 3, 16 * e.fout(), e.rotation, 10, (x, y) -> { + Fill.circle(vec.x + x, vec.y + y, 3 * e.fout()); + }); + vec.trns(e.rotation, -4f).add(e.x, e.y); + Angles.randLenVectors(e.id + 2, 3, 16 * e.fout(), e.rotation + 180, 10, (x, y) -> { + Fill.circle(vec.x + x, vec.y + y, 3 * e.fout()); }); - Draw.alpha(e.fin() / 7f); - randLenVectors(e.id/2, 3, 16f * e.fout(), e.rotation, 20f, (x, y) -> { - Fill.rect(vec.x + x, vec.y + y, 5f * e.fout(), e.fout(), vec.angleTo(vec.x + x, vec.y + y)); + Draw.alpha(e.fin() / 7); + Angles.randLenVectors(e.id + 1, 3, 16 * e.fout(), e.rotation + 180, 20, (x, y) -> { + Fill.rect(vec.x + x, vec.y + y, 5 * e.fout(), e.fout(), vec.angleTo(vec.x + x, vec.y + y)); + }); + vec.trns(e.rotation, 4f).add(e.x, e.y); + Angles.randLenVectors(e.id + 3, 3, 16 * e.fout(), e.rotation, 20, (x, y) -> { + Fill.rect(vec.x + x, vec.y + y, 5 * e.fout(), e.fout(), vec.angleTo(vec.x + x, vec.y + y)); }); }), diff --git a/src/omaloon/content/blocks/OlDefenceBlocks.java b/src/omaloon/content/blocks/OlDefenceBlocks.java index d6b6490d..cd62122a 100644 --- a/src/omaloon/content/blocks/OlDefenceBlocks.java +++ b/src/omaloon/content/blocks/OlDefenceBlocks.java @@ -62,7 +62,7 @@ public static void load(){ ambientSoundVolume = 0.08f; consumePower(0.2f); - consume(new ConsumeFluid(null, 0.1f) {{ + consume(new ConsumeFluid(null, 1f/12f) {{ continuous = true; hasOptimalPressure = true; diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidValve.java b/src/omaloon/world/blocks/liquid/PressureLiquidValve.java index 2ad7fc4d..e895bf21 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidValve.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidValve.java @@ -2,6 +2,7 @@ import arc.*; import arc.audio.*; +import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; @@ -33,7 +34,8 @@ public class PressureLiquidValve extends Block { public Effect jamEffect = Fx.explosion; public Sound jamSound = OlSounds.jam; - public Effect pumpingEffect = OlFx.pumpBack; + public Effect pumpingEffectOut = OlFx.pumpOut; + public Effect pumpingEffectIn = OlFx.pumpIn; public float pumpingEffectInterval = 15; public float pressureLoss = 0.05f; @@ -157,7 +159,7 @@ public void draw() { } Draw.rect(tiles[tiling], x, y, rot); Draw.rect(topRegion, x, y); - Draw.rect(valveRegion, x, y, draining * (rotation%2 == 0 ? -90 : 90) + rot); + Draw.rect(valveRegion, x, y, draining * (rotation % 2 == 0 ? -90f : 90f) + rot); } @Override @@ -205,25 +207,24 @@ public void updatePressure() { addFluid(null, Math.max(minPressureLoss, pressureLoss * Math.abs(pressureAmount - openMin)/10f)); draining = Mathf.approachDelta(draining, 1, 0.014f); - if (effectInterval > pumpingEffectInterval) { - effectInterval = 0; - pumpingEffect.at(x, y, -draining * (rotation % 2 == 0 ? 90 : -90) - (rotate ? (90 - rotdeg()) % 180 - 90 : 0), pressure.getMain()); - pumpingEffect.at(x, y, draining * (rotation % 2 == 0 ? -90 : 90) + (rotate ? (90 + rotdeg()) % 180 - 90 : 0), pressure.getMain()); - } }; if (pressureAmount > openMax) { effectInterval += delta(); removeFluid(pressure.getMain(), Math.max(minPressureLoss, pressureLoss * Math.abs(pressureAmount - openMax)/10f)); draining = Mathf.approachDelta(draining, 1, 0.014f); - - if (effectInterval > pumpingEffectInterval) { - effectInterval = 0; - pumpingEffect.at(x, y, -draining * (rotation % 2 == 0 ? 90 : -90) - (rotate ? (90 - rotdeg()) % 180 - 90 : 0), pressure.getMain()); - pumpingEffect.at(x, y, draining * (rotation % 2 == 0 ? -90 : 90) + (rotate ? (90 + rotdeg()) % 180 - 90 : 0), pressure.getMain()); - } }; + if (effectInterval > pumpingEffectInterval) { + effectInterval = 0; + if (pressureAmount > openMax) { + pumpingEffectOut.at(x, y, draining * (rotation % 2 == 0 ? -90f : 90f) + (rotate ? (90 + rotdeg()) % 180 - 90 : 0), pressure.getMain() == null ? Color.white : pressure.getMain().color); + } else { + pumpingEffectIn.at(x, y, draining * (rotation % 2 == 0 ? -90f : 90f) + (rotate ? (90 + rotdeg()) % 180 - 90 : 0)); + } + } - if (pressureAmount < openMin && pressureAmount > openMax) draining = Mathf.approachDelta(draining, 0, 0.014f); + if (pressureAmount >= openMin && pressureAmount <= openMax) { + draining = Mathf.approachDelta(draining, 0, 0.014f); + } if (pressureAmount < jamPoint) { jammed = true; diff --git a/src/omaloon/world/interfaces/HasPressure.java b/src/omaloon/world/interfaces/HasPressure.java index c540cc62..530d9584 100644 --- a/src/omaloon/world/interfaces/HasPressure.java +++ b/src/omaloon/world/interfaces/HasPressure.java @@ -29,6 +29,8 @@ default boolean acceptsPressurizedFluid(HasPressure from, @Nullable Liquid liqui * Adds a certain amount of a fluid into this module through the section. */ default void addFluid(@Nullable Liquid liquid, float amount) { + if (amount == 0) return; + if (amount < 0) pressure().section.removeFluid(liquid, -amount); pressure().section.addFluid(liquid, amount); } @@ -79,13 +81,6 @@ default HasPressure getPressureDestination(HasPressure from, float pressure) { return this; } - /** - * adds pressure not taking anything into account - */ - default void handlePressure(float pressure) { - pressure().pressure += pressure; - } - default float moveLiquidPressure(HasPressure next, Liquid liquid) { // if (next != null) { // next = (HasPressure) next.getLiquidDestination(as(), liquid); @@ -151,6 +146,8 @@ default boolean outputsPressurizedFluid(HasPressure to, @Nullable Liquid liquid, * Removes a certain amount of a fluid into this module through the section. */ default void removeFluid(@Nullable Liquid liquid, float amount) { + if (amount == 0) return; + if (amount < 0) pressure().section.addFluid(liquid, -amount); pressure().section.removeFluid(liquid, amount); } From 3e41e2eb817b926b288cf6bc6fb4c9f59626b803 Mon Sep 17 00:00:00 2001 From: = Date: Tue, 17 Dec 2024 23:35:36 -0300 Subject: [PATCH 12/54] add groups --- src/omaloon/content/OlFx.java | 8 ++-- .../content/blocks/OlProductionBlocks.java | 15 ++++++- .../blocks/liquid/PressureLiquidBridge.java | 39 ++++++++++++---- .../blocks/liquid/PressureLiquidConduit.java | 2 + .../blocks/liquid/PressureLiquidGauge.java | 7 +++ .../blocks/liquid/PressureLiquidPump.java | 12 ++--- .../blocks/liquid/PressureLiquidValve.java | 11 ++++- .../blocks/production/PressureDrill.java | 15 ++++++- .../world/blocks/production/Pressurizer.java | 1 + src/omaloon/world/consumers/ConsumeFluid.java | 6 +-- src/omaloon/world/interfaces/HasPressure.java | 44 +------------------ src/omaloon/world/meta/FluidGroup.java | 12 +++++ src/omaloon/world/meta/PressureConfig.java | 26 ++++++++--- 13 files changed, 125 insertions(+), 73 deletions(-) create mode 100644 src/omaloon/world/meta/FluidGroup.java diff --git a/src/omaloon/content/OlFx.java b/src/omaloon/content/OlFx.java index 228532b2..a172d62a 100644 --- a/src/omaloon/content/OlFx.java +++ b/src/omaloon/content/OlFx.java @@ -186,19 +186,19 @@ public class OlFx { Draw.color(e.color); Draw.alpha(e.fout() / 5); vec.trns(e.rotation, 4f).add(e.x, e.y); - Angles.randLenVectors(e.id, 3, 16 * e.fin(), e.rotation + 180, 10, (x, y) -> { + Angles.randLenVectors(e.id, 3, 16 * e.fin(), e.rotation, 10, (x, y) -> { Fill.circle(vec.x + x, vec.y + y, 3 * e.fin()); }); vec.trns(e.rotation, -4f).add(e.x, e.y); - Angles.randLenVectors(e.id + 2, 3, 16 * e.fin(), e.rotation, 10, (x, y) -> { + Angles.randLenVectors(e.id + 2, 3, 16 * e.fin(), e.rotation + 180, 10, (x, y) -> { Fill.circle(vec.x + x, vec.y + y, 3 * e.fin()); }); Draw.alpha(e.fout() / 7); - Angles.randLenVectors(e.id + 1, 3, 16 * e.fin(), e.rotation, 20, (x, y) -> { + Angles.randLenVectors(e.id + 1, 3, 16 * e.fin(), e.rotation + 180, 20, (x, y) -> { Fill.rect(vec.x + x, vec.y + y, 5 * e.fin(), e.fin(), vec.angleTo(vec.x + x, vec.y + y)); }); vec.trns(e.rotation, 4f).add(e.x, e.y); - Angles.randLenVectors(e.id + 3, 3, 16 * e.fin(), e.rotation + 180, 20, (x, y) -> { + Angles.randLenVectors(e.id + 3, 3, 16 * e.fin(), e.rotation, 20, (x, y) -> { Fill.rect(vec.x + x, vec.y + y, 5 * e.fin(), e.fin(), vec.angleTo(vec.x + x, vec.y + y)); }); }), diff --git a/src/omaloon/content/blocks/OlProductionBlocks.java b/src/omaloon/content/blocks/OlProductionBlocks.java index b0575f9b..9a683828 100644 --- a/src/omaloon/content/blocks/OlProductionBlocks.java +++ b/src/omaloon/content/blocks/OlProductionBlocks.java @@ -33,8 +33,19 @@ public static void load(){ pressureConfig.linkList.add(this); - consume(new ConsumePressure(-6, false)); - consume(new PressureEfficiencyRange(-45f, -1f, 2f, true)); + consume(new ConsumeFluid(null, -5f) {{ + startRange = -45f; + endRange = -0.01f; + efficiencyMultiplier = 2f; + + optimalPressure = -40f; + hasOptimalPressure = true; + + curve = t -> Math.min( + 9f/8f * (1f - t), + 9f * t + ); + }}); }}; pressurizer = new Pressurizer("air-well") {{ diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidBridge.java b/src/omaloon/world/blocks/liquid/PressureLiquidBridge.java index a9aeadf1..125b2695 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidBridge.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidBridge.java @@ -17,7 +17,7 @@ import mindustry.world.*; import mindustry.world.blocks.liquid.*; import mindustry.world.blocks.sandbox.*; -import mindustry.world.meta.BlockGroup; +import mindustry.world.meta.*; import omaloon.world.blocks.distribution.*; import omaloon.world.interfaces.*; import omaloon.world.meta.*; @@ -40,7 +40,6 @@ public class PressureLiquidBridge extends TubeItemBridge { public PressureLiquidBridge(String name) { super(name); - hasLiquids = true; hasItems = false; outputsLiquid = true; canOverdrive = false; @@ -121,6 +120,13 @@ public TextureRegion[] icons(){ return new TextureRegion[]{atlas.find(name + "-icon")}; } + @Override + public void init() { + super.init(); + + if (pressureConfig.fluidGroup == null) pressureConfig.fluidGroup = FluidGroup.transportation; + } + @Override public void load() { super.load(); @@ -148,8 +154,8 @@ public class PressureLiquidBridgeBuild extends TubeItemBridgeBuild implements Ha PressureModule pressure = new PressureModule(); @Override - public boolean acceptLiquid(Building source, Liquid liquid) { - return source.block.hasLiquids; + public boolean acceptsPressurizedFluid(HasPressure from, @Nullable Liquid liquid, float amount) { + return HasPressure.super.acceptsPressurizedFluid(from, liquid, amount) && (liquid == pressure.getMain() || liquid == null || pressure.getMain() == null || from.pressure().getMain() == null); } @Override @@ -179,9 +185,14 @@ public void draw() { Draw.alpha(Renderer.bridgeOpacity); drawBridge(bridgeBottomRegion, endBottomRegion, pos1, pos2); - Draw.color(liquids.current().color, liquids.currentAmount()/liquidCapacity * liquids.current().color.a * Renderer.bridgeOpacity); - drawBridge(bridgeLiquidRegion, endLiquidRegion, pos1, pos2); - Draw.color(); + + Liquid main = pressure.getMain(); + + if (main != null) { + Draw.color(main.color, Mathf.clamp(pressure.liquids[main.id]/(pressure.liquids[main.id] + pressure.air)) * Renderer.bridgeOpacity); + drawBridge(bridgeLiquidRegion, endLiquidRegion, pos1, pos2); + Draw.color(); + } Draw.alpha(Renderer.bridgeOpacity); drawBridge(pos1, pos2); @@ -196,6 +207,18 @@ public Seq nextBuilds(boolean flow) { return o; } + @Override + public void onProximityUpdate() { + super.onProximityUpdate(); + + new PressureSection().mergeFlood(this); + } + + @Override + public boolean outputsPressurizedFluid(HasPressure to, Liquid liquid, float amount) { + return HasPressure.super.outputsPressurizedFluid(to, liquid, amount) && (liquid == to.pressure().getMain() || liquid == null || pressure.getMain() == null || to.pressure().getMain() == null); + } + @Override public PressureModule pressure() { return pressure; } @@ -216,9 +239,7 @@ public void updateTile() { checkIncoming(); - nextBuilds(true).each(b -> moveLiquidPressure(b, liquids.current())); updatePressure(); - dumpPressure(); Tile other = world.tile(link); if(linkValid(tile, other)) { diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidConduit.java b/src/omaloon/world/blocks/liquid/PressureLiquidConduit.java index 540a3062..42c4d422 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidConduit.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidConduit.java @@ -49,6 +49,8 @@ public void init(){ if(junctionReplacement == null) junctionReplacement = OlDistributionBlocks.liquidJunction; if(bridgeReplacement == null || !(bridgeReplacement instanceof ItemBridge)) bridgeReplacement = OlDistributionBlocks.liquidBridge; + + if (pressureConfig.fluidGroup == null) pressureConfig.fluidGroup = FluidGroup.transportation; } @Override diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidGauge.java b/src/omaloon/world/blocks/liquid/PressureLiquidGauge.java index ded57fa3..0384688e 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidGauge.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidGauge.java @@ -55,6 +55,13 @@ public TextureRegion[] icons() { return new TextureRegion[]{region}; } + @Override + public void init() { + super.init(); + + if (pressureConfig.fluidGroup == null) pressureConfig.fluidGroup = FluidGroup.transportation; + } + @Override public void load() { super.load(); diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidPump.java b/src/omaloon/world/blocks/liquid/PressureLiquidPump.java index 0b33977a..bd052070 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidPump.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidPump.java @@ -76,6 +76,13 @@ public void drawPlanRegion(BuildPlan plan, Eachable list) { return new TextureRegion[]{region, topRegion}; } + @Override + public void init() { + super.init(); + + pressureConfig.fluidGroup = FluidGroup.pumps; + } + @Override public void load() { super.load(); @@ -181,11 +188,6 @@ public void draw() { if (tiling == 0) Draw.rect(topRegion, x, y, rotdeg()); } - @Override - public HasPressure getSectionDestination(HasPressure from) { - return null; - } - @Override public Seq nextBuilds(boolean flow) { return Seq.with(); diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidValve.java b/src/omaloon/world/blocks/liquid/PressureLiquidValve.java index e895bf21..f3357877 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidValve.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidValve.java @@ -80,6 +80,13 @@ public TextureRegion[] icons() { return new TextureRegion[]{bottomRegion, region}; } + @Override + public void init() { + super.init(); + + if (pressureConfig.fluidGroup == null) pressureConfig.fluidGroup = FluidGroup.transportation; + } + @Override public void load() { super.load(); @@ -207,12 +214,12 @@ public void updatePressure() { addFluid(null, Math.max(minPressureLoss, pressureLoss * Math.abs(pressureAmount - openMin)/10f)); draining = Mathf.approachDelta(draining, 1, 0.014f); - }; + } if (pressureAmount > openMax) { effectInterval += delta(); removeFluid(pressure.getMain(), Math.max(minPressureLoss, pressureLoss * Math.abs(pressureAmount - openMax)/10f)); draining = Mathf.approachDelta(draining, 1, 0.014f); - }; + } if (effectInterval > pumpingEffectInterval) { effectInterval = 0; if (pressureAmount > openMax) { diff --git a/src/omaloon/world/blocks/production/PressureDrill.java b/src/omaloon/world/blocks/production/PressureDrill.java index 050c0016..f61bbb6e 100644 --- a/src/omaloon/world/blocks/production/PressureDrill.java +++ b/src/omaloon/world/blocks/production/PressureDrill.java @@ -17,6 +17,13 @@ public PressureDrill(String name) { pressureConfig.isWhitelist = true; } + @Override + public void init() { + super.init(); + + if (pressureConfig.fluidGroup == null) pressureConfig.fluidGroup = FluidGroup.drills; + } + @Override public void setBars() { super.setBars(); @@ -49,6 +56,13 @@ public float efficiencyMultiplier() { return super.getProgressIncrease(baseTime) * efficiencyMultiplier(); } + @Override + public void onProximityUpdate() { + super.onProximityUpdate(); + + new PressureSection().mergeFlood(this); + } + @Override public PressureModule pressure() { return pressure; } @@ -66,7 +80,6 @@ public void read(Reads read, byte revision) { public void updateTile() { super.updateTile(); updatePressure(); - dumpPressure(); } @Override public void write(Writes write) { diff --git a/src/omaloon/world/blocks/production/Pressurizer.java b/src/omaloon/world/blocks/production/Pressurizer.java index 3e7a0bd1..0e51216a 100644 --- a/src/omaloon/world/blocks/production/Pressurizer.java +++ b/src/omaloon/world/blocks/production/Pressurizer.java @@ -35,6 +35,7 @@ public Pressurizer(String name) { update = true; destructible = true; solid = true; + saveConfig = copyConfig = true; config(Boolean.class, (PressurizerBuild build, Boolean bool) -> build.reverse = bool); } diff --git a/src/omaloon/world/consumers/ConsumeFluid.java b/src/omaloon/world/consumers/ConsumeFluid.java index 0441db47..ccfef804 100644 --- a/src/omaloon/world/consumers/ConsumeFluid.java +++ b/src/omaloon/world/consumers/ConsumeFluid.java @@ -66,15 +66,15 @@ public HasPressure cast(Building build) { public void display(Stats stats) { if (amount != 0) { if (continuous) { - stats.add(OlStats.removeFluid, OlStats.fluid(fluid, amount, 1f, true)); + stats.add(amount > 0 ? OlStats.removeFluid : OlStats.addFluid, OlStats.fluid(fluid, Math.abs(amount), 1f, true)); } else { - stats.add(OlStats.removeFluid, OlStats.fluid(fluid, amount, 60f, false)); + stats.add(amount > 0 ? OlStats.removeFluid : OlStats.addFluid, OlStats.fluid(fluid, Math.abs(amount), 60f, false)); } } if (startRange != endRange) { stats.add(OlStats.pressureRange, Core.bundle.get("stat.omaloon-pressurerange.format"), Strings.autoFixed(startRange, 2), Strings.autoFixed(endRange, 2)); - if (hasOptimalPressure) stats.add(OlStats.optimalPressure, Core.bundle.get("stat.omaloon-optimal-pressure.format"), Strings.autoFixed(optimalPressure, 2), Strings.autoFixed(efficiencyMultiplier, 2)); + if (hasOptimalPressure) stats.add(OlStats.optimalPressure, Core.bundle.get("stat.omaloon-optimal-pressure.format"), Strings.autoFixed(optimalPressure, 2), Strings.autoFixed(efficiencyMultiplier * 100f, 2)); } } diff --git a/src/omaloon/world/interfaces/HasPressure.java b/src/omaloon/world/interfaces/HasPressure.java index 530d9584..975dcea5 100644 --- a/src/omaloon/world/interfaces/HasPressure.java +++ b/src/omaloon/world/interfaces/HasPressure.java @@ -78,50 +78,10 @@ default HasPressure getPressureDestination(HasPressure from, float pressure) { * Returns the building whose section should be the same as this build's section. */ default @Nullable HasPressure getSectionDestination(HasPressure from) { + if (pressureConfig().fluidGroup == null || pressureConfig().fluidGroup == FluidGroup.unset || pressureConfig().fluidGroup != from.pressureConfig().fluidGroup) return null; return this; } - default float moveLiquidPressure(HasPressure next, Liquid liquid) { -// if (next != null) { -// next = (HasPressure) next.getLiquidDestination(as(), liquid); -// if (next.team() == team() && next.block().hasLiquids && liquids().get(liquid) > 0f) { -// float ofract = next.liquids().get(liquid) / next.block().liquidCapacity; -// float fract = liquids().get(liquid) / block().liquidCapacity; -// float flow = Math.min(Mathf.clamp(fract - ofract) * block().liquidCapacity, liquids().get(liquid)) * getPressureFlow(next); -// flow = Math.min(flow, next.block().liquidCapacity - next.liquids().get(liquid))/2; -// if (flow > 0f && ofract <= fract && next.acceptLiquid(this.as(), liquid)) { -// next.handleLiquid(this.as(), liquid, flow); -// liquids().remove(liquid, flow); -// return flow; -// } -// -// if (!next.block().consumesLiquid(liquid) && next.liquids().currentAmount() / next.block().liquidCapacity > 0.1F && fract > 0.1F) { -// float fx = (x() + next.x()) / 2f; -// float fy = (y() + next.y()) / 2f; -// Liquid other = next.liquids().current(); -// if (other.blockReactive && liquid.blockReactive) { -// if ((!(other.flammability > 0.3F) || !(liquid.temperature > 0.7F)) && (!(liquid.flammability > 0.3F) || !(other.temperature > 0.7F))) { -// 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)); -// if (Mathf.chanceDelta(0.20000000298023224)) { -// Fx.steam.at(fx, fy); -// } -// } -// } else { -// this.damageContinuous(1.0F); -// next.damageContinuous(1.0F); -// if (Mathf.chanceDelta(0.1)) { -// Fx.fire.at(fx, fy); -// } -// } -// } -// } -// } -// -// } - return 0.0F; - } - /** * @param flow determines if the returned value will have only builds to which it can flow pressure to */ @@ -164,7 +124,7 @@ default void updatePressure() { /** * removes pressure not taking anything into account */ - default void removePressure(float pressure) { + default @Deprecated void removePressure(float pressure) { pressure().pressure -= pressure; } } diff --git a/src/omaloon/world/meta/FluidGroup.java b/src/omaloon/world/meta/FluidGroup.java new file mode 100644 index 00000000..ba491d91 --- /dev/null +++ b/src/omaloon/world/meta/FluidGroup.java @@ -0,0 +1,12 @@ +package omaloon.world.meta; + +public enum FluidGroup { + /** + * This group specifically acts the same as if the group is null. Only used if blocks that normally override the group have to be independent. + */ + unset, + + drills, + pumps, + transportation +} diff --git a/src/omaloon/world/meta/PressureConfig.java b/src/omaloon/world/meta/PressureConfig.java index 18cf7794..9ac37c3e 100644 --- a/src/omaloon/world/meta/PressureConfig.java +++ b/src/omaloon/world/meta/PressureConfig.java @@ -14,6 +14,11 @@ import omaloon.world.interfaces.*; public class PressureConfig { + /** + * Group used for the creation of sections. if null, this block will be a section containing only itself. + */ + public FluidGroup fluidGroup; + /** * If true, this block's section will be able to receive fluids. */ @@ -27,11 +32,22 @@ public class PressureConfig { */ public boolean isWhitelist = false; - public float - overPressureDamage = 0.33f, - underPressureDamage = 0.66f, - maxPressure = 50, - minPressure = -50f; + /** + * Damage applied each tick if pressure is higher than maxPressure. + */ + public float overPressureDamage = 0.33f; + /** + * Damage applied each tick if pressure is lower than minPressure. + */ + public float underPressureDamage = 0.66f; + /** + * Maximum pressure that this block can contain before it over-pressurizes. + */ + public float maxPressure = 50; + /** + * Minimum pressure that this block can contain before it under-pressurizes. + */ + public float minPressure = -50f; /** * Standard capacity for this block. Does not define max amount that this can hold. That is defined by maxPressure and minPressure. From 1f6c794716cf71a80493e1d974443988d4eb36d9 Mon Sep 17 00:00:00 2001 From: = Date: Wed, 18 Dec 2024 00:23:25 -0300 Subject: [PATCH 13/54] generic crafters were rather easy --- .../content/blocks/OlCraftingBlocks.java | 26 ++++++++++++++++--- .../world/blocks/production/HammerDrill.java | 2 +- .../blocks/production/PressureCrafter.java | 12 +++++---- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/src/omaloon/content/blocks/OlCraftingBlocks.java b/src/omaloon/content/blocks/OlCraftingBlocks.java index 3a7ed0fe..56f049ac 100644 --- a/src/omaloon/content/blocks/OlCraftingBlocks.java +++ b/src/omaloon/content/blocks/OlCraftingBlocks.java @@ -26,8 +26,17 @@ public static void load() { craftEffect = OlFx.carborundumCraft; consumeItems(with(Items.beryllium, 1, OlItems.cobalt, 1)); - consume(new ConsumePressure(6f, false)); - consume(new PressureEfficiencyRange(5f, 50f, 1.6f, false)); + consume(new ConsumeFluid(null, 5) {{ + startRange = 5f; + endRange = 50f; + efficiencyMultiplier = 1.6f; + curve = t -> Math.min( + 9f/2f * (1f - t), + 9f/7f * t + ); + optimalPressure = 40f; + hasOptimalPressure = true; + }}); outputItems = with(OlItems.carborundum, 1); }}; @@ -44,8 +53,17 @@ public static void load() { craftEffect = Fx.pulverizeMedium; consumeItem(Items.coal, 4); - consume(new ConsumePressure(8f, false)); - consume(new PressureEfficiencyRange(10f, 50f, 1.5f, false)); + consume(new ConsumeFluid(null, 8f) {{ + startRange = 10f; + endRange = 50f; + efficiencyMultiplier = 1.5f; + curve = t -> Math.min( + 8f * (1f - t), + 8f/7f * t + ); + optimalPressure = 45f; + hasOptimalPressure = true; + }}); outputItem = new ItemStack(Items.graphite, 2); }}; diff --git a/src/omaloon/world/blocks/production/HammerDrill.java b/src/omaloon/world/blocks/production/HammerDrill.java index db6ce011..2703d606 100644 --- a/src/omaloon/world/blocks/production/HammerDrill.java +++ b/src/omaloon/world/blocks/production/HammerDrill.java @@ -81,7 +81,7 @@ public boolean shouldConsume(){ @Override public void updateTile(){ updatePressure(); - dumpPressure(); + if(timer(timerDump, dumpTime)){ dump(dominantItem != null && items.has(dominantItem) ? dominantItem : null); } diff --git a/src/omaloon/world/blocks/production/PressureCrafter.java b/src/omaloon/world/blocks/production/PressureCrafter.java index 72c216c1..9ea63132 100644 --- a/src/omaloon/world/blocks/production/PressureCrafter.java +++ b/src/omaloon/world/blocks/production/PressureCrafter.java @@ -1,6 +1,5 @@ package omaloon.world.blocks.production; -import arc.util.*; import arc.util.io.*; import mindustry.world.blocks.production.*; import mindustry.world.consumers.*; @@ -13,8 +12,6 @@ public class PressureCrafter extends GenericCrafter { public boolean useConsumerMultiplier = true; - public float outputPressure = 0; - public PressureCrafter(String name) { super(name); pressureConfig.isWhitelist = true; @@ -30,7 +27,6 @@ public void setBars() { public void setStats() { super.setStats(); pressureConfig.addStats(stats); - if (outputPressure != 0) stats.add(OlStats.outputPressure, Strings.autoFixed(outputPressure, 2), OlStats.pressureUnits); } public class PressureCrafterBuild extends GenericCrafterBuild implements HasPressure { @@ -53,6 +49,13 @@ public float efficiencyMultiplier() { return super.getProgressIncrease(baseTime) * efficiencyMultiplier(); } + @Override + public void onProximityUpdate() { + super.onProximityUpdate(); + + new PressureSection().mergeFlood(this); + } + @Override public PressureModule pressure() { return pressure; } @@ -70,7 +73,6 @@ public void read(Reads read, byte revision) { public void updateTile() { super.updateTile(); updatePressure(); - dumpPressure(); } @Override From 8f5ac1eb556fe74aba446080247c37bc644a6114 Mon Sep 17 00:00:00 2001 From: = Date: Wed, 18 Dec 2024 13:17:44 -0300 Subject: [PATCH 14/54] finally remove the old consumers --- .../content/blocks/OlDefenceBlocks.java | 15 +- src/omaloon/ui/dialogs/EventHints.java | 32 ---- .../world/blocks/defense/BlastTower.java | 178 +++++++++--------- .../world/blocks/defense/ConsumeTurret.java | 10 +- src/omaloon/world/blocks/defense/Shelter.java | 1 - .../world/consumers/ConsumePressure.java | 48 ----- .../consumers/PressureEfficiencyRange.java | 59 ------ src/omaloon/world/interfaces/HasPressure.java | 7 - 8 files changed, 113 insertions(+), 237 deletions(-) delete mode 100644 src/omaloon/world/consumers/ConsumePressure.java delete mode 100644 src/omaloon/world/consumers/PressureEfficiencyRange.java diff --git a/src/omaloon/content/blocks/OlDefenceBlocks.java b/src/omaloon/content/blocks/OlDefenceBlocks.java index cd62122a..71c263b7 100644 --- a/src/omaloon/content/blocks/OlDefenceBlocks.java +++ b/src/omaloon/content/blocks/OlDefenceBlocks.java @@ -163,8 +163,19 @@ Items.graphite, new BasicBulletType(4f, 16){{ )); size = 2; consumePower(70f / 60f); - consume(new ConsumePressure(-6, false)); - consume(new PressureEfficiencyRange(-45f, -1f, 3f, true)); + consume(new ConsumeFluid(null, 6f) {{ + startRange = -45f; + endRange = -0.01f; + efficiencyMultiplier = 3f; + + optimalPressure = -40f; + hasOptimalPressure = true; + + curve = t -> Math.min( + 9f/8f * (1f - t), + 9f * t + ); + }}); targetGround = true; targetAir = false; damage = 0.6f; diff --git a/src/omaloon/ui/dialogs/EventHints.java b/src/omaloon/ui/dialogs/EventHints.java index e9cc5363..904862b2 100644 --- a/src/omaloon/ui/dialogs/EventHints.java +++ b/src/omaloon/ui/dialogs/EventHints.java @@ -6,9 +6,7 @@ import arc.util.*; import mindustry.*; import mindustry.ui.fragments.HintsFragment.*; -import mindustry.world.consumers.*; import omaloon.content.blocks.*; -import omaloon.world.consumers.*; import omaloon.world.interfaces.*; public enum EventHints implements Hint { @@ -21,36 +19,6 @@ public enum EventHints implements Hint { () -> Vars.state.teams.get(Vars.state.rules.defaultTeam).getBuildings(OlCraftingBlocks.carborundumPress).find(b -> ((HasPressure) b).getPressure() < 0f) != null || Vars.state.teams.get(Vars.state.rules.defaultTeam).getBuildings(OlDefenceBlocks.smallShelter).find(b -> ((HasPressure) b).getPressure() < 0f) != null ), - pump_positive( - () -> false, - () -> Vars.state.teams.get(Vars.state.rules.defaultTeam).buildings.contains( - b -> { - if (b instanceof HasPressure pressureBuilding) { - for (Consume consumer : b.block().consumers) { - if (consumer instanceof PressureEfficiencyRange rangeConsumer) { - return pressureBuilding.getPressure() > 0 && rangeConsumer.shouldConsume(pressureBuilding); - } - } - } - return false; - } - ) - ), - pump_negative( - () -> false, - () -> Vars.state.teams.get(Vars.state.rules.defaultTeam).buildings.contains( - b -> { - if (b instanceof HasPressure pressureBuilding) { - for (Consume consumer : b.block().consumers) { - if (consumer instanceof PressureEfficiencyRange rangeConsumer) { - return pressureBuilding.getPressure() < 0 && rangeConsumer.shouldConsume(pressureBuilding); - } - } - } - return false; - } - ) - ), pump( () -> false, () -> !Vars.state.teams.get(Vars.state.rules.defaultTeam).getBuildings(OlDistributionBlocks.liquidPump).isEmpty() diff --git a/src/omaloon/world/blocks/defense/BlastTower.java b/src/omaloon/world/blocks/defense/BlastTower.java index 132845b1..37b1bb5a 100644 --- a/src/omaloon/world/blocks/defense/BlastTower.java +++ b/src/omaloon/world/blocks/defense/BlastTower.java @@ -99,76 +99,6 @@ public class BlastTowerBuild extends Building implements HasPressure { public float lastShootTime = -reload; public Seq targets = new Seq<>(); - public float efficiencyMultiplier() { - float val = 1f; - if (!useConsumerMultiplier) return val; - for (Consume consumer : consumers) { - val *= consumer.efficiencyMultiplier(this); - } - return val; - } - - @Override - public void updateTile() { - updatePressure(); - dumpPressure(); - super.updateTile(); - - targets.clear(); - Units.nearbyEnemies(team, x, y, range, u -> { - if(u.checkTarget(targetAir, targetGround)) { - targets.add(u); - } - }); - - indexer.allBuildings(x, y, range, b -> { - if(b.team != team){ - targets.add(b); - } - }); - - float effMultiplier = efficiencyMultiplier(); - - if (targets.size > 0 && canConsume()) { - smoothProgress = Mathf.approach(smoothProgress, 1f, Time.delta / chargeTime * effMultiplier); - - if (efficiency > 0 && (charge += Time.delta * effMultiplier) >= reload && smoothProgress >= 0.99f) { - shoot(); - charge = 0f; - } - } else { - smoothProgress = Mathf.approach(smoothProgress, 0f, Time.delta / chargeTime * effMultiplier); - } - } - - public void shoot() { - if (!canConsume()) return; - - consume(); - lastShootTime = Time.time; - Effect.shake(shake, shake, this); - shootSound.at(this); - waveEffect.layer(Layer.blockUnder).at(x, y, range, waveColor); - tile.getLinkedTiles(t -> OlFx.hammerHit.layer(Layer.blockUnder).at( - t.worldx(), t.worldy(), - angleTo(t.worldx(), t.worldy()) + Mathf.range(360f), - Tmp.c1.set(t.floor().mapColor).mul(1.5f + Mathf.range(0.15f))) - ); - - float damageMultiplier = efficiencyMultiplier(); - for (Teamc target : targets) { - hitEffect.at(target.x(), target.y(), hitColor); - if(target instanceof Healthc){ - ((Healthc)target).damage(damage * damageMultiplier); - } - if(target instanceof Statusc){ - ((Statusc)target).apply(status, statusDuration); - } - } - - smoothProgress = 0f; - } - @Override public void draw() { Draw.rect(region, x, y); @@ -186,23 +116,21 @@ public void drawSelect(){ Drawf.dashCircle(x, y, range, Pal.accent); } - @Override - public void write(Writes write) { - super.write(write); - write.f(lastShootTime); - write.f(smoothProgress); - write.f(charge); - pressure.write(write); - } + public float efficiencyMultiplier() { + float val = 1f; + if (!useConsumerMultiplier) return val; + for (Consume consumer : consumers) { + val *= consumer.efficiencyMultiplier(this); + } + return val; + } - @Override - public void read(Reads read, byte revision) { - super.read(read, revision); - lastShootTime = read.f(); - smoothProgress = read.f(); - charge = read.f(); - pressure.read(read); - } + @Override + public void onProximityUpdate() { + super.onProximityUpdate(); + + new PressureSection().mergeFlood(this); + } @Override public PressureModule pressure() { @@ -213,5 +141,83 @@ public PressureModule pressure() { public PressureConfig pressureConfig() { return pressureConfig; } + + @Override + public void read(Reads read, byte revision) { + super.read(read, revision); + lastShootTime = read.f(); + smoothProgress = read.f(); + charge = read.f(); + pressure.read(read); + } + + public void shoot() { + if (!canConsume()) return; + + consume(); + lastShootTime = Time.time; + Effect.shake(shake, shake, this); + shootSound.at(this); + waveEffect.layer(Layer.blockUnder).at(x, y, range, waveColor); + tile.getLinkedTiles(t -> OlFx.hammerHit.layer(Layer.blockUnder).at( + t.worldx(), t.worldy(), + angleTo(t.worldx(), t.worldy()) + Mathf.range(360f), + Tmp.c1.set(t.floor().mapColor).mul(1.5f + Mathf.range(0.15f))) + ); + + float damageMultiplier = efficiencyMultiplier(); + for (Teamc target : targets) { + hitEffect.at(target.x(), target.y(), hitColor); + if(target instanceof Healthc){ + ((Healthc)target).damage(damage * damageMultiplier); + } + if(target instanceof Statusc){ + ((Statusc)target).apply(status, statusDuration); + } + } + + smoothProgress = 0f; + } + + @Override + public void updateTile() { + updatePressure(); + super.updateTile(); + + targets.clear(); + Units.nearbyEnemies(team, x, y, range, u -> { + if(u.checkTarget(targetAir, targetGround)) { + targets.add(u); + } + }); + + indexer.allBuildings(x, y, range, b -> { + if(b.team != team){ + targets.add(b); + } + }); + + float effMultiplier = efficiencyMultiplier(); + + if (targets.size > 0 && canConsume()) { + smoothProgress = Mathf.approach(smoothProgress, 1f, Time.delta / chargeTime * effMultiplier); + + if (efficiency > 0 && (charge += Time.delta * effMultiplier) >= reload && smoothProgress >= 0.99f) { + shoot(); + charge = 0f; + } + } else { + smoothProgress = Mathf.approach(smoothProgress, 0f, Time.delta / chargeTime * effMultiplier); + } + } + + @Override + public void write(Writes write) { + super.write(write); + write.f(lastShootTime); + write.f(smoothProgress); + write.f(charge); + pressure.write(write); + } } } \ No newline at end of file diff --git a/src/omaloon/world/blocks/defense/ConsumeTurret.java b/src/omaloon/world/blocks/defense/ConsumeTurret.java index 8efe418d..28bb66cd 100644 --- a/src/omaloon/world/blocks/defense/ConsumeTurret.java +++ b/src/omaloon/world/blocks/defense/ConsumeTurret.java @@ -17,7 +17,7 @@ public class ConsumeTurret extends Turret { public PressureConfig pressureConfig = new PressureConfig(); /** - * if true, min range this turret can only target + * If true, this turret cannot target things that are closer than the minRange */ public boolean minRangeShoot = true; @@ -67,6 +67,13 @@ protected void findTarget() { return canConsume(); } + @Override + public void onProximityUpdate() { + super.onProximityUpdate(); + + new PressureSection().mergeFlood(this); + } + @Override public BulletType peekAmmo() { return shootType; } @@ -93,7 +100,6 @@ protected void shoot(BulletType type) { @Override public void updateTile() { updatePressure(); - dumpPressure(); super.updateTile(); } diff --git a/src/omaloon/world/blocks/defense/Shelter.java b/src/omaloon/world/blocks/defense/Shelter.java index 558a69e6..3026d8ec 100644 --- a/src/omaloon/world/blocks/defense/Shelter.java +++ b/src/omaloon/world/blocks/defense/Shelter.java @@ -246,7 +246,6 @@ public void read(Reads read, byte revision) { @Override public void updateTile() { updatePressure(); - dumpPressure(); if (efficiency > 0) { if (shieldDamage >= 0) { shieldDamage -= edelta() * (broken ? rechargeBroken : rechargeStandard); diff --git a/src/omaloon/world/consumers/ConsumePressure.java b/src/omaloon/world/consumers/ConsumePressure.java deleted file mode 100644 index 7ef73160..00000000 --- a/src/omaloon/world/consumers/ConsumePressure.java +++ /dev/null @@ -1,48 +0,0 @@ -package omaloon.world.consumers; - -import arc.math.*; -import arc.util.*; -import mindustry.gen.*; -import mindustry.world.*; -import mindustry.world.consumers.*; -import mindustry.world.meta.*; -import omaloon.world.interfaces.*; -import omaloon.world.meta.*; - -public class ConsumePressure extends Consume { - public float amount; - public boolean continuous; - - public ConsumePressure(float amount, boolean continuous) { - this.amount = amount; - this.continuous = continuous; - } - - public HasPressure cast(Building build) { - try { - return (HasPressure) build; - } catch(Exception e) { - throw new RuntimeException("This consumer should be used on a building that implements HasPressure", e); - } - } - - @Override public void apply(Block block) { - block.hasLiquids = true; - } - - @Override - public void display(Stats stats) { - if (continuous) { - stats.add(OlStats.consumePressure, Mathf.round(amount * 60f, 2), OlStats.pressureSecond); - } else { - stats.add(OlStats.consumePressure, Mathf.round(amount, 2), OlStats.pressureUnits); - } - } - - @Override public void trigger(Building build) { - if (!continuous) cast(build).removePressure(amount); - } - @Override public void update(Building build) { - if (continuous) cast(build).removePressure(amount * Time.delta); - } -} diff --git a/src/omaloon/world/consumers/PressureEfficiencyRange.java b/src/omaloon/world/consumers/PressureEfficiencyRange.java deleted file mode 100644 index f7e7d74a..00000000 --- a/src/omaloon/world/consumers/PressureEfficiencyRange.java +++ /dev/null @@ -1,59 +0,0 @@ -package omaloon.world.consumers; - -import arc.*; -import arc.math.*; -import arc.util.*; -import mindustry.gen.*; -import mindustry.world.*; -import mindustry.world.consumers.*; -import mindustry.world.meta.*; -import omaloon.world.interfaces.*; -import omaloon.world.meta.*; - -public class PressureEfficiencyRange extends Consume { - public float startRange, endRange, efficiencyMultiplier; - public boolean reverse; - - public PressureEfficiencyRange(float startRange, float endRange, float efficiencyMultiplier, boolean reverse) { - this.startRange = startRange; - this.endRange = endRange; - this.efficiencyMultiplier = efficiencyMultiplier; - this.reverse = reverse; - } - - @Override public void apply(Block block) { - block.hasLiquids = true; - } - - public HasPressure cast(Building build) { - try { - return (HasPressure) build; - } catch(Exception e) { - throw new RuntimeException("This consumer should be used on a building that implements HasPressure", e); - } - } - - @Override - public void display(Stats stats) { - stats.add(OlStats.pressureRange, Core.bundle.get("stat.omaloon-pressurerange.format"), Strings.autoFixed(startRange, 2), Strings.autoFixed(endRange, 2)); - } - - @Override - public float efficiency(Building build) { - return shouldConsume(cast(build)) ? 1f : 0f; - } - @Override - public float efficiencyMultiplier(Building build) { - if (!shouldConsume(cast(build))) return 0f; - if (reverse) { - return Mathf.maxZero(Mathf.map(cast(build).getPressure(), endRange, startRange, 1f, efficiencyMultiplier)); - } else { - return Mathf.maxZero(Mathf.map(cast(build).getPressure(), startRange, endRange, 1f, efficiencyMultiplier)); - } - } - - public boolean shouldConsume(HasPressure build) { - int pressure = Math.round(build.getPressure()); - return startRange <= pressure && pressure <= endRange; - } -} diff --git a/src/omaloon/world/interfaces/HasPressure.java b/src/omaloon/world/interfaces/HasPressure.java index 975dcea5..00cde3e5 100644 --- a/src/omaloon/world/interfaces/HasPressure.java +++ b/src/omaloon/world/interfaces/HasPressure.java @@ -120,11 +120,4 @@ default void updatePressure() { if (Mathf.round(pressure().getPressure(liquid)) > pressureConfig().maxPressure + 1) damage(pressureConfig().overPressureDamage); }); } - - /** - * removes pressure not taking anything into account - */ - default @Deprecated void removePressure(float pressure) { - pressure().pressure -= pressure; - } } From 06f618cdd87f3c8dedc6e10f762c84533d3abf8d Mon Sep 17 00:00:00 2001 From: = Date: Wed, 18 Dec 2024 21:26:09 -0300 Subject: [PATCH 15/54] source --- .../blocks/liquid/PressureLiquidBridge.java | 7 +- .../blocks/sandbox/PressureLiquidSource.java | 144 ++++++++++++++---- src/omaloon/world/modules/PressureModule.java | 6 +- 3 files changed, 119 insertions(+), 38 deletions(-) diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidBridge.java b/src/omaloon/world/blocks/liquid/PressureLiquidBridge.java index 125b2695..4bc2178f 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidBridge.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidBridge.java @@ -167,8 +167,9 @@ public boolean canDumpLiquid(Building to, Liquid liquid) { public void draw() { Draw.rect(bottomRegion, x, y); - if(liquids.currentAmount() > 0.001f){ - LiquidBlock.drawTiledFrames(size, x, y, liquidPadding, liquids.current(), liquids.currentAmount() / liquidCapacity); + Liquid main = pressure.getMain(); + if(main != null && pressure.liquids[main.id] > 0.001f){ + LiquidBlock.drawTiledFrames(size, x, y, liquidPadding, pressure.getMain(), Mathf.clamp(pressure.liquids[main.id]/(pressure.liquids[main.id] + pressure.air))); } drawBase(); @@ -186,8 +187,6 @@ public void draw() { Draw.alpha(Renderer.bridgeOpacity); drawBridge(bridgeBottomRegion, endBottomRegion, pos1, pos2); - Liquid main = pressure.getMain(); - if (main != null) { Draw.color(main.color, Mathf.clamp(pressure.liquids[main.id]/(pressure.liquids[main.id] + pressure.air)) * Renderer.bridgeOpacity); drawBridge(bridgeLiquidRegion, endLiquidRegion, pos1, pos2); diff --git a/src/omaloon/world/blocks/sandbox/PressureLiquidSource.java b/src/omaloon/world/blocks/sandbox/PressureLiquidSource.java index 5393c2bb..95a8a056 100644 --- a/src/omaloon/world/blocks/sandbox/PressureLiquidSource.java +++ b/src/omaloon/world/blocks/sandbox/PressureLiquidSource.java @@ -2,43 +2,66 @@ import arc.*; import arc.graphics.g2d.*; +import arc.math.*; +import arc.scene.style.*; +import arc.scene.ui.*; +import arc.scene.ui.ImageButton.*; import arc.scene.ui.layout.*; import arc.util.*; import arc.util.io.*; +import mindustry.*; import mindustry.entities.units.*; import mindustry.gen.*; import mindustry.type.*; import mindustry.ui.*; -import mindustry.world.blocks.sandbox.*; +import mindustry.world.*; +import mindustry.world.blocks.liquid.*; import omaloon.world.interfaces.*; import omaloon.world.meta.*; import omaloon.world.modules.*; -import static arc.scene.ui.TextField.TextFieldFilter.*; -import static arc.util.Strings.*; - -public class PressureLiquidSource extends LiquidSource { - // TODO cheap fix, this class should be remade to have proper configs - public static float lastAmount = 0; - public static boolean wasNegative = false; - +public class PressureLiquidSource extends Block { public PressureConfig pressureConfig = new PressureConfig(); + public TextureRegion bottomRegion; + public PressureLiquidSource(String name) { super(name); + solid = true; + destructible = true; + update = true; + configurable = true; + saveConfig = copyConfig = true; + + config(SourceEntry.class, (PressureLiquidSourceBuild build, SourceEntry entry) -> { + build.liquid = entry.fluid == null ? -1 : entry.fluid.id; + build.targetAmount = entry.amount; + }); } @Override public void drawPlanConfig(BuildPlan plan, Eachable list) { - Draw.rect(crossRegion, plan.drawx(), plan.drawy()); - drawPlanConfigCenter(plan, plan.config, "center", false); + Draw.rect(bottomRegion, plan.drawx(), plan.drawy()); + if (plan.config instanceof SourceEntry e && e.fluid != null) LiquidBlock.drawTiledFrames(size, plan.drawx(), plan.drawy(), 0f, e.fluid, 1f); + Draw.rect(region, plan.drawx(), plan.drawy()); } @Override public void load() { super.load(); bottomRegion = Core.atlas.find(name + "-bottom"); - crossRegion = Core.atlas.find(name + "-cross"); + } + + @Override + protected TextureRegion[] icons() { + return new TextureRegion[]{bottomRegion, region}; + } + + @Override + public void init() { + super.init(); + + if (pressureConfig.fluidGroup != null) pressureConfig.fluidGroup = FluidGroup.transportation; } @Override @@ -47,26 +70,74 @@ public void setBars() { pressureConfig.addBars(this); } - public class PressureLiquidSourceBuild extends LiquidSourceBuild implements HasPressure { + public class PressureLiquidSourceBuild extends Building implements HasPressure { PressureModule pressure = new PressureModule(); - public float pressureTarget = lastAmount; - public boolean negative = wasNegative; - @Override public boolean acceptLiquid(Building source, Liquid liquid) { - return false; + public int liquid = -1; + public float targetAmount; + + @Override + public void buildConfiguration(Table cont) { + cont.table(Styles.black6, table -> { + table.pane(Styles.smallPane, liquids -> Vars.content.liquids().each(liquid -> { + Button button = liquids.button( + new TextureRegionDrawable(liquid.uiIcon), + new ImageButtonStyle() {{ + over = Styles.flatOver; + down = checked = Tex.flatDownBase; + }}, () -> { + if (this.liquid != liquid.id) { + configure(new SourceEntry() {{ + fluid = liquid; + amount = targetAmount; + }}); + } else { + configure(new SourceEntry() {{ + fluid = null; + amount = targetAmount; + }}); + } + } + ).tooltip(liquid.localizedName).size(40f).get(); + button.update(() -> button.setChecked(liquid.id == this.liquid)); + if ((Vars.content.liquids().indexOf(liquid) + 1) % 4 == 0) liquids.row(); + })).maxHeight(160f).row(); + table.add("@filter.option.amount").padTop(5f).padBottom(5f).row(); + table.field( + "" + targetAmount, + (field, c) -> Character.isDigit(c) || ((!field.getText().contains(".")) && c == '.') || (field.getText().isEmpty() && c == '-'), + s -> configure(new SourceEntry() {{ + fluid = Vars.content.liquid(liquid); + amount = Strings.parseFloat(s, 0f); + }}) + ); + }).margin(5f); } - @Override public boolean acceptsPressure(HasPressure from, float pressure) { - return false; + + @Override + public SourceEntry config() { + return new SourceEntry() {{ + fluid = Vars.content.liquid(liquid); + amount = targetAmount; + }}; + } + + @Override + public void draw() { + Draw.rect(bottomRegion, x, y); + + if(liquid != -1) { + LiquidBlock.drawTiledFrames(size, x, y, 0f, Vars.content.liquid(liquid), 1f); + } + + Draw.rect(region, x, y); } @Override - public void buildConfiguration(Table table) { - super.buildConfiguration(table); - table.row(); - table.table(Styles.black6, cont -> { - cont.field(pressureTarget + "", floatsOnly, s -> pressureTarget = parseFloat(s, 0f)).row(); - cont.check(Core.bundle.get("omaloon-source-negative"), negative, b -> negative = b); - }).growX(); + public void onProximityUpdate() { + super.onProximityUpdate(); + + new PressureSection().mergeFlood(this); } @Override public PressureModule pressure() { @@ -80,24 +151,31 @@ public void buildConfiguration(Table table) { public void read(Reads read, byte revision) { super.read(read, revision); pressure.read(read); - pressureTarget = read.f(); - negative = read.bool(); + liquid = read.i(); + if (Vars.content.liquid(liquid) == null) liquid = -1; + targetAmount = read.f(); } @Override public void updateTile() { super.updateTile(); - pressure.pressure = pressureTarget * (negative ? -1f : 1f); - nextBuilds(true).each(b -> b.pressure().pressure = pressureTarget * (negative ? -1 : 1f)); - dumpPressure(); + + float difference = (Vars.content.liquid(liquid) == null ? targetAmount : Mathf.maxZero(targetAmount)) - (Vars.content.liquid(liquid) == null ? pressure.air : pressure.liquids[liquid]); + + addFluid(Vars.content.liquid(liquid), difference); } @Override public void write(Writes write) { super.write(write); pressure.write(write); - write.f(pressureTarget); - write.bool(negative); + write.i(liquid); + write.f(targetAmount); } } + + public static class SourceEntry { + public @Nullable Liquid fluid; + public float amount; + } } diff --git a/src/omaloon/world/modules/PressureModule.java b/src/omaloon/world/modules/PressureModule.java index c1d71737..8aa751b6 100644 --- a/src/omaloon/world/modules/PressureModule.java +++ b/src/omaloon/world/modules/PressureModule.java @@ -27,6 +27,10 @@ public void addFluid(@Nullable Liquid liquid, float amount, PressureConfig refer air += amount; pressure = air / reference.fluidCapacity * arbitraryPressureScalar; } else { + if (air < 0) { + air = 0; + pressure = 0; + } liquids[liquid.id] += amount; pressures[liquid.id] = liquids[liquid.id] / reference.fluidCapacity * arbitraryPressureScalar; } @@ -62,7 +66,7 @@ public void read(Reads read) { */ public void removeFluid(@Nullable Liquid liquid, float amount, PressureConfig reference) { if (liquid == null) { - air -= amount; + air -= (getMain() != null ? Math.min(air, amount) : amount); pressure = air / reference.fluidCapacity * arbitraryPressureScalar; } else { liquids[liquid.id] = Mathf.maxZero(liquids[liquid.id] - amount); From 5eed8871b0777e3abbfa17a33eb8286aeaad1a84 Mon Sep 17 00:00:00 2001 From: = Date: Thu, 19 Dec 2024 11:53:56 -0300 Subject: [PATCH 16/54] chainable pumps --- .../blocks/liquid/PressureLiquidJunction.java | 17 ++++++ .../blocks/liquid/PressureLiquidPump.java | 52 ++++++++++++++++--- src/omaloon/world/interfaces/HasPressure.java | 13 ----- 3 files changed, 61 insertions(+), 21 deletions(-) diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidJunction.java b/src/omaloon/world/blocks/liquid/PressureLiquidJunction.java index b7df79a7..7f127f5c 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidJunction.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidJunction.java @@ -1,8 +1,10 @@ package omaloon.world.blocks.liquid; import arc.struct.*; +import arc.util.*; import arc.util.io.*; import mindustry.gen.*; +import mindustry.type.*; import mindustry.world.*; import omaloon.world.interfaces.*; import omaloon.world.meta.*; @@ -20,6 +22,10 @@ public PressureLiquidJunction(String name) { public class PressureLiquidJunctionBuild extends Building implements HasPressure { PressureModule pressure = new PressureModule(); + @Override public boolean acceptsPressurizedFluid(HasPressure from, @Nullable Liquid liquid, float amount) { + return false; + } + @Override public boolean connects(HasPressure to) { return HasPressure.super.connects(to) && !(to instanceof PressureLiquidPump); @@ -46,6 +52,17 @@ public Seq nextBuilds(boolean flow) { return Seq.with(); } + @Override + public void onProximityUpdate() { + super.onProximityUpdate(); + + new PressureSection().mergeFlood(this); + } + + @Override public boolean outputsPressurizedFluid(HasPressure to, @Nullable Liquid liquid, float amount) { + return false; + } + @Override public PressureModule pressure() { return pressure; } diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidPump.java b/src/omaloon/world/blocks/liquid/PressureLiquidPump.java index bd052070..536eec67 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidPump.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidPump.java @@ -6,7 +6,6 @@ import arc.math.*; import arc.math.geom.*; import arc.scene.ui.layout.*; -import arc.struct.*; import arc.util.*; import arc.util.io.*; import mindustry.*; @@ -126,13 +125,24 @@ public class PressureLiquidPumpBuild extends Building implements HasPressure { public int filter = -1; + @Override public boolean acceptsPressurizedFluid(HasPressure from, @Nullable Liquid liquid, float amount) { + return false; + } + @Override public void buildConfiguration(Table table) { ItemSelection.buildTable(table, Vars.content.liquids(), () -> Vars.content.liquid(filter), other -> filter = other == null ? -1 : other.id); } + /** + * Returns the length of the pump chain + */ + public int chainSize() { + return pressure.section.builds.size; + } + @Override public boolean connects(HasPressure to) { - return HasPressure.super.connects(to) && !(to instanceof PressureLiquidPumpBuild) && (front() == to || back() == to); + return HasPressure.super.connects(to) && (front() == to || back() == to); } @Override @@ -188,9 +198,31 @@ public void draw() { if (tiling == 0) Draw.rect(topRegion, x, y, rotdeg()); } - @Override - public Seq nextBuilds(boolean flow) { - return Seq.with(); + /** + * Returns the building at the start of the pump chain. + */ + public @Nullable HasPressure getFrom() { + PressureLiquidPumpBuild last = this; + HasPressure out = back() instanceof HasPressure back ? back.getPressureDestination(last, 0) : null; + while (out instanceof PressureLiquidPumpBuild pump) { + if (!pump.connected(last)) return null; + last = pump; + out = pump.back() instanceof HasPressure back ? back.getPressureDestination(last, 0) : null; + } + return out.connected(last) ? out : null; + } + /** + * Returns the building at the end of the pump chain. + */ + public @Nullable HasPressure getTo() { + PressureLiquidPumpBuild last = this; + HasPressure out = front() instanceof HasPressure front ? front.getPressureDestination(last, 0) : null; + while (out instanceof PressureLiquidPumpBuild pump) { + if (!pump.connected(last)) return null; + last = pump; + out = pump.front() instanceof HasPressure front ? front.getPressureDestination(last, 0) : null; + } + return out.connected(last) ? out : null; } @Override @@ -205,6 +237,10 @@ public void onProximityUpdate() { new PressureSection().mergeFlood(this); } + @Override public boolean outputsPressurizedFluid(HasPressure to, @Nullable Liquid liquid, float amount) { + return false; + } + @Override public PressureModule pressure() { return pressure; } @@ -223,13 +259,13 @@ public void read(Reads read, byte revision) { public void updateTile() { super.updateTile(); if (efficiency > 0) { - HasPressure front = (front() instanceof HasPressure b && connected(b)) ? b : null; - HasPressure back = (back() instanceof HasPressure b && connected(b)) ? b : null; + 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 * (backPressure - frontPressure + pressureDifference); + 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) && diff --git a/src/omaloon/world/interfaces/HasPressure.java b/src/omaloon/world/interfaces/HasPressure.java index 00cde3e5..f9177a3f 100644 --- a/src/omaloon/world/interfaces/HasPressure.java +++ b/src/omaloon/world/interfaces/HasPressure.java @@ -47,19 +47,6 @@ default boolean connects(HasPressure to) { return pressureConfig().outputsPressure || pressureConfig().acceptsPressure; } - /** - * dumps pressure onto available builds - */ - default void dumpPressure() { -// for (HasPressure other : nextBuilds(true)) { -// float diff = (getPressure() - other.getPressure()) / 2f; -// if (other.getPressure() > getPressure()) diff *= -1f; -// if (canDumpPressure(other, diff)) { -// transferPressure(other, diff); -// } -// } - } - /** * @return current pressure of the building */ From 18b3bbc7c42ce21e285fc3151f1cb70620eaf863 Mon Sep 17 00:00:00 2001 From: = Date: Thu, 19 Dec 2024 17:35:38 -0300 Subject: [PATCH 17/54] smooth --- .../blocks/liquid/PressureLiquidBridge.java | 21 ++++++------ .../blocks/liquid/PressureLiquidConduit.java | 17 +++++++--- .../blocks/liquid/PressureLiquidPump.java | 19 +++++++---- .../blocks/liquid/PressureLiquidValve.java | 14 +++++--- src/omaloon/world/modules/PressureModule.java | 33 ++++++++++++++++--- 5 files changed, 74 insertions(+), 30 deletions(-) diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidBridge.java b/src/omaloon/world/blocks/liquid/PressureLiquidBridge.java index 4bc2178f..7adc9ab8 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidBridge.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidBridge.java @@ -153,6 +153,8 @@ public void setStats() { public class PressureLiquidBridgeBuild extends TubeItemBridgeBuild implements HasPressure { PressureModule pressure = new PressureModule(); + public float smoothAlpha; + @Override public boolean acceptsPressurizedFluid(HasPressure from, @Nullable Liquid liquid, float amount) { return HasPressure.super.acceptsPressurizedFluid(from, liquid, amount) && (liquid == pressure.getMain() || liquid == null || pressure.getMain() == null || from.pressure().getMain() == null); @@ -168,8 +170,11 @@ public void draw() { Draw.rect(bottomRegion, x, y); Liquid main = pressure.getMain(); - if(main != null && pressure.liquids[main.id] > 0.001f){ - LiquidBlock.drawTiledFrames(size, x, y, liquidPadding, pressure.getMain(), Mathf.clamp(pressure.liquids[main.id]/(pressure.liquids[main.id] + pressure.air))); + + smoothAlpha = Mathf.approachDelta(smoothAlpha, main == null ? 0f : pressure.liquids[main.id]/(pressure.liquids[main.id] + pressure.air), PressureModule.smoothingSpeed); + + if(smoothAlpha > 0.001f){ + LiquidBlock.drawTiledFrames(size, x, y, liquidPadding, pressure.current, Mathf.clamp(smoothAlpha)); } drawBase(); @@ -187,8 +192,8 @@ public void draw() { Draw.alpha(Renderer.bridgeOpacity); drawBridge(bridgeBottomRegion, endBottomRegion, pos1, pos2); - if (main != null) { - Draw.color(main.color, Mathf.clamp(pressure.liquids[main.id]/(pressure.liquids[main.id] + pressure.air)) * Renderer.bridgeOpacity); + if (smoothAlpha > 0.001f) { + Draw.color(pressure.current.color, Mathf.clamp(smoothAlpha) * Renderer.bridgeOpacity); drawBridge(bridgeLiquidRegion, endLiquidRegion, pos1, pos2); Draw.color(); } @@ -229,6 +234,7 @@ public boolean outputsPressurizedFluid(HasPressure to, Liquid liquid, float amou public void read(Reads read, byte revision) { super.read(read, revision); pressure.read(read); + smoothAlpha = read.f(); } @Override @@ -287,12 +293,7 @@ protected void drawInput(Tile other){ public void write(Writes write) { super.write(write); pressure.write(write); - } - - @Override - public void read(Reads read){ - super.read(read); - pressure.read(read); + write.f(smoothAlpha); } } } diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidConduit.java b/src/omaloon/world/blocks/liquid/PressureLiquidConduit.java index 42c4d422..c20e51e4 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidConduit.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidConduit.java @@ -143,9 +143,11 @@ public void setStats() { } public class PressureLiquidConduitBuild extends Building implements HasPressure { - public int tiling = 0; PressureModule pressure = new PressureModule(); + public int tiling = 0; + public float smoothAlpha; + @Override public boolean acceptsPressurizedFluid(HasPressure from, @Nullable Liquid liquid, float amount) { return HasPressure.super.acceptsPressurizedFluid(from, liquid, amount) && (liquid == pressure.getMain() || liquid == null || pressure.getMain() == null || from.pressure().getMain() == null); @@ -163,13 +165,16 @@ public boolean connects(HasPressure to) { public void draw() { Draw.rect(bottomRegion, x, y); Liquid main = pressure.getMain(); - if (main != null && pressure.liquids[main.id] > 0.01f) { - int frame = main.getAnimationFrame(); - int gas = main.gas ? 1 : 0; + + smoothAlpha = Mathf.approachDelta(smoothAlpha, main == null ? 0f : pressure.liquids[main.id]/(pressure.liquids[main.id] + pressure.air), PressureModule.smoothingSpeed); + + if (smoothAlpha > 0.001f) { + int frame = pressure.current.getAnimationFrame(); + int gas = pressure.current.gas ? 1 : 0; float xscl = Draw.xscl, yscl = Draw.yscl; Draw.scl(1f, 1f); - Drawf.liquid(liquidRegions[gas][frame], x, y, Mathf.clamp(pressure.liquids[main.id]/(pressure.liquids[main.id] + pressure.air)), main.color.write(Tmp.c1).a(1f)); + Drawf.liquid(liquidRegions[gas][frame], x, y, Mathf.clamp(smoothAlpha), pressure.current.color.write(Tmp.c1).a(1f)); Draw.scl(xscl, yscl); } Draw.rect(topRegions[tiling], x, y, tiling != 0 ? 0 : (rotdeg() + 90) % 180 - 90); @@ -206,6 +211,7 @@ public boolean outputsPressurizedFluid(HasPressure to, Liquid liquid, float amou public void read(Reads read, byte revision) { super.read(read, revision); pressure.read(read); + smoothAlpha = read.f(); } @Override @@ -217,6 +223,7 @@ public void updateTile() { public void write(Writes write) { super.write(write); pressure.write(write); + write.f(smoothAlpha); } } } diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidPump.java b/src/omaloon/world/blocks/liquid/PressureLiquidPump.java index 536eec67..00155bea 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidPump.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidPump.java @@ -122,6 +122,7 @@ public class PressureLiquidPumpBuild extends Building implements HasPressure { PressureModule pressure = new PressureModule(); public int tiling; + public float smoothAlpha; public int filter = -1; @@ -151,8 +152,8 @@ public void draw() { if (tiling != 0) { Draw.rect(bottomRegion, x, y, rotdeg()); - HasPressure front = (front() instanceof HasPressure b && connected(b)) ? b : null; - HasPressure back = (back() instanceof HasPressure b && connected(b)) ? b : null; + HasPressure front = getTo(); + HasPressure back = getFrom(); if ( (front != null && front.pressure().getMain() != null) || @@ -177,11 +178,13 @@ public void draw() { (back != null && back.pressure().getMain() != null ? Mathf.clamp(back.pressure().liquids[back.pressure().getMain().id]/(back.pressure().liquids[back.pressure().getMain().id] + back.pressure().air)) : 0); alpha /= ((front == null ? 0 : 1f) + (back == null ? 0 : 1f)); + smoothAlpha = Mathf.approachDelta(smoothAlpha, alpha, PressureModule.smoothingSpeed); + Liquid drawLiquid = Liquids.water; if (front != null && front.pressure().getMain() != null) { - drawLiquid = front.pressure().getMain(); + drawLiquid = front.pressure().current; } else if (back != null && back.pressure().getMain() != null) { - drawLiquid = back.pressure().getMain(); + drawLiquid = back.pressure().current; } int frame = drawLiquid.getAnimationFrame(); @@ -189,7 +192,7 @@ public void draw() { float xscl = Draw.xscl, yscl = Draw.yscl; Draw.scl(1f, 1f); - Drawf.liquid(liquidRegions[gas][frame], x, y, alpha, tmpColor); + Drawf.liquid(liquidRegions[gas][frame], x, y, smoothAlpha, tmpColor); Draw.scl(xscl, yscl); } Draw.rect(arrowRegion, x, y, rotdeg()); @@ -209,7 +212,7 @@ public void draw() { last = pump; out = pump.back() instanceof HasPressure back ? back.getPressureDestination(last, 0) : null; } - return out.connected(last) ? out : null; + return (out != null && out.connected(last)) ? out : null; } /** * Returns the building at the end of the pump chain. @@ -222,7 +225,7 @@ public void draw() { last = pump; out = pump.front() instanceof HasPressure front ? front.getPressureDestination(last, 0) : null; } - return out.connected(last) ? out : null; + return (out != null && out.connected(last)) ? out : null; } @Override @@ -253,6 +256,7 @@ public void read(Reads read, byte revision) { super.read(read, revision); pressure.read(read); filter = read.i(); + smoothAlpha = read.f(); } @Override @@ -283,6 +287,7 @@ public void write(Writes write) { super.write(write); pressure.write(write); write.i(filter); + write.f(smoothAlpha); } } } diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidValve.java b/src/omaloon/world/blocks/liquid/PressureLiquidValve.java index f3357877..a51db7f7 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidValve.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidValve.java @@ -135,6 +135,7 @@ public class PressureLiquidValveBuild extends Building implements HasPressure { public float draining; public float effectInterval; public int tiling; + public float smoothAlpha; public boolean jammed; @@ -155,13 +156,16 @@ public void draw() { float rot = rotate ? (90 + rotdeg()) % 180 - 90 : 0; Draw.rect(bottomRegion, x, y, rotation); Liquid main = pressure.getMain(); - if (main != null && pressure.liquids[main.id] > 0.01f) { - int frame = main.getAnimationFrame(); - int gas = main.gas ? 1 : 0; + + smoothAlpha = Mathf.approachDelta(smoothAlpha, main == null ? 0f : pressure.liquids[main.id]/(pressure.liquids[main.id] + pressure.air), PressureModule.smoothingSpeed); + + if (smoothAlpha > 0.01f) { + int frame = pressure.current.getAnimationFrame(); + int gas = pressure.current.gas ? 1 : 0; float xscl = Draw.xscl, yscl = Draw.yscl; Draw.scl(1f, 1f); - Drawf.liquid(liquidRegions[gas][frame], x, y, Mathf.clamp(pressure.liquids[main.id]/(pressure.liquids[main.id] + pressure.air)), main.color.write(Tmp.c1).a(1f)); + Drawf.liquid(liquidRegions[gas][frame], x, y, Mathf.clamp(smoothAlpha), pressure.current.color.write(Tmp.c1).a(1f)); Draw.scl(xscl, yscl); } Draw.rect(tiles[tiling], x, y, rot); @@ -199,6 +203,7 @@ public void read(Reads read, byte revision) { pressure.read(read); jammed = read.bool(); draining = read.f(); + smoothAlpha = read.f(); } @Override @@ -251,6 +256,7 @@ public void write(Writes write) { pressure.write(write); write.bool(jammed); write.f(draining); + write.f(smoothAlpha); } } } diff --git a/src/omaloon/world/modules/PressureModule.java b/src/omaloon/world/modules/PressureModule.java index 8aa751b6..3caec27e 100644 --- a/src/omaloon/world/modules/PressureModule.java +++ b/src/omaloon/world/modules/PressureModule.java @@ -4,12 +4,14 @@ import arc.util.*; import arc.util.io.*; import mindustry.*; +import mindustry.content.*; import mindustry.type.*; import mindustry.world.modules.*; import omaloon.world.meta.*; public class PressureModule extends BlockModule { public static float arbitraryPressureScalar = 10f; + public static float smoothingSpeed = 0.03f; public float[] liquids = new float[Vars.content.liquids().size]; public float[] pressures = new float[Vars.content.liquids().size]; @@ -17,7 +19,7 @@ public class PressureModule extends BlockModule { public PressureSection section = new PressureSection(); - public @Nullable Liquid current; + public Liquid current = Liquids.water; /** * Adds a certain amount of a fluid into this module, updating it's pressure accordingly. A null liquid means that air is being added to it. @@ -34,13 +36,13 @@ public void addFluid(@Nullable Liquid liquid, float amount, PressureConfig refer liquids[liquid.id] += amount; pressures[liquid.id] = liquids[liquid.id] / reference.fluidCapacity * arbitraryPressureScalar; } - current = liquid; + if (liquid != null) current = liquid; } public @Nullable Liquid getMain() { Liquid out = null; for(int i = 0; i < liquids.length; i++) { - if (out == null && liquids[i] > 0) out = Vars.content.liquid(i); + if (out == null && liquids[i] > 0.01) out = Vars.content.liquid(i); if (out != null && liquids[i] > liquids[out.id]) out = Vars.content.liquid(i); } return out; @@ -58,7 +60,21 @@ public float getPressure(@Nullable Liquid liquid) { @Override public void read(Reads read) { + air = read.f(); pressure = read.f(); + + int count = read.s(); + + for(int i = 0; i < count; i++){ + Liquid liq = Vars.content.liquid(read.s()); + float amount = read.f(); + float pressure = read.f(); + if(liq != null){ + if (amount > 0) current = liq; + liquids[liq.id] = amount; + pressures[liq.id] = pressure; + } + } } /** @@ -72,11 +88,20 @@ public void removeFluid(@Nullable Liquid liquid, float amount, PressureConfig re liquids[liquid.id] = Mathf.maxZero(liquids[liquid.id] - amount); pressures[liquid.id] = liquids[liquid.id] / reference.fluidCapacity * arbitraryPressureScalar; } - current = liquid; + if (liquid != null) current = liquid; } @Override public void write(Writes write) { + write.f(air); write.f(pressure); + + write.s(liquids.length); + + for(int i = 0; i < liquids.length; i++){ + write.s(i); //liquid ID + write.f(liquids[i]); //liquid amount + write.f(pressures[i]); //liquid amount + } } } From 965f01f1c51d3d4e5971d2efadb254caabc9dfde Mon Sep 17 00:00:00 2001 From: = Date: Fri, 20 Dec 2024 17:47:11 -0300 Subject: [PATCH 18/54] =?UTF-8?q?m=C3=A6th?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/omaloon/math/OlMath.java | 20 +++++++++++++++++++ .../blocks/liquid/PressureLiquidValve.java | 7 ++++--- 2 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 src/omaloon/math/OlMath.java diff --git a/src/omaloon/math/OlMath.java b/src/omaloon/math/OlMath.java new file mode 100644 index 00000000..e8c7f8b4 --- /dev/null +++ b/src/omaloon/math/OlMath.java @@ -0,0 +1,20 @@ +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. + * + * area is in world units squared. + * pressureStart and pressureEnd are in pascals + * density is in liquid units / world units cubed + * time is in ticks + * + * returns the amount of fluid in liquid units that passes through the area over a certain time. + */ + public static float bernoulliFlowRate(float area, float pressureStart, float pressureEnd, float density, float time) { + float diff = -2f * (pressureEnd - pressureStart); + return (area * (diff/Math.abs(diff)) * Mathf.sqrt(Math.abs(diff) / density) * time * density)/(60f); + } +} diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidValve.java b/src/omaloon/world/blocks/liquid/PressureLiquidValve.java index a51db7f7..473903bd 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidValve.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidValve.java @@ -16,6 +16,7 @@ import mindustry.type.*; import mindustry.world.*; import omaloon.content.*; +import omaloon.math.*; import omaloon.utils.*; import omaloon.world.interfaces.*; import omaloon.world.meta.*; @@ -38,7 +39,7 @@ public class PressureLiquidValve extends Block { public Effect pumpingEffectIn = OlFx.pumpIn; public float pumpingEffectInterval = 15; - public float pressureLoss = 0.05f; + public float pressureLoss = 1f; public float minPressureLoss = 0.05f; public float openMin = -15f; @@ -216,13 +217,13 @@ public void updatePressure() { if (jammed) return; if (pressureAmount < openMin) { effectInterval += delta(); - addFluid(null, Math.max(minPressureLoss, pressureLoss * Math.abs(pressureAmount - openMin)/10f)); + addFluid(null, Math.min(openMin - pressureAmount, OlMath.bernoulliFlowRate(pressureLoss, 0, pressureAmount, 1f, 1f))); draining = Mathf.approachDelta(draining, 1, 0.014f); } if (pressureAmount > openMax) { effectInterval += delta(); - removeFluid(pressure.getMain(), Math.max(minPressureLoss, pressureLoss * Math.abs(pressureAmount - openMax)/10f)); + removeFluid(pressure.getMain(), Math.min(pressureAmount - openMax, OlMath.bernoulliFlowRate(pressureLoss, pressureAmount, 0, 1f, 1f))); draining = Mathf.approachDelta(draining, 1, 0.014f); } if (effectInterval > pumpingEffectInterval) { From c968f0477dbecae9df67203b857d4963d609b6f1 Mon Sep 17 00:00:00 2001 From: = Date: Sun, 29 Dec 2024 15:35:51 -0300 Subject: [PATCH 19/54] this can be removed :3 --- .../world/blocks/liquid/PressureLiquidJunction.java | 2 +- src/omaloon/world/interfaces/HasPressure.java | 7 ------- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidJunction.java b/src/omaloon/world/blocks/liquid/PressureLiquidJunction.java index 7f127f5c..e2870bfb 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidJunction.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidJunction.java @@ -37,7 +37,7 @@ public HasPressure getPressureDestination(HasPressure source, float pressure) { int dir = (source.relativeTo(tile.x, tile.y) + 4) % 4; HasPressure next = nearby(dir) instanceof HasPressure ? (HasPressure) nearby(dir) : null; - if(next == null || (!next.acceptsPressure(source, pressure) && !(next.block() instanceof PressureLiquidJunction))){ + if(next == null || !(next.block() instanceof PressureLiquidJunction)){ return this; } return next.getPressureDestination(this, pressure); diff --git a/src/omaloon/world/interfaces/HasPressure.java b/src/omaloon/world/interfaces/HasPressure.java index f9177a3f..e7ea75e0 100644 --- a/src/omaloon/world/interfaces/HasPressure.java +++ b/src/omaloon/world/interfaces/HasPressure.java @@ -14,13 +14,6 @@ * only added this cause my ide did a funni */ public interface HasPressure extends Buildingc { - /** - * @return true if this building accepts a certain pressure amount from some building - */ - default boolean acceptsPressure(HasPressure from, float pressure) { - return getPressure() + pressure <= from.getPressure() - pressure; - } - default boolean acceptsPressurizedFluid(HasPressure from, @Nullable Liquid liquid, float amount) { return pressureConfig().acceptsPressure; } From 935c72f4879c5b668009d442094f1f56351a60c9 Mon Sep 17 00:00:00 2001 From: = Date: Sun, 29 Dec 2024 21:23:18 -0300 Subject: [PATCH 20/54] some fixes and more cleanup + a convenient --- src/omaloon/math/OlMath.java | 1 + src/omaloon/ui/dialogs/EventHints.java | 24 +++++++------------ .../blocks/liquid/PressureLiquidBridge.java | 4 ++-- .../blocks/liquid/PressureLiquidJunction.java | 2 +- src/omaloon/world/consumers/ConsumeFluid.java | 2 +- src/omaloon/world/interfaces/HasPressure.java | 11 ++------- src/omaloon/world/meta/PressureSection.java | 2 +- src/omaloon/world/modules/PressureModule.java | 8 +++++++ 8 files changed, 25 insertions(+), 29 deletions(-) diff --git a/src/omaloon/math/OlMath.java b/src/omaloon/math/OlMath.java index e8c7f8b4..ae7b5076 100644 --- a/src/omaloon/math/OlMath.java +++ b/src/omaloon/math/OlMath.java @@ -15,6 +15,7 @@ public class OlMath { */ public static float bernoulliFlowRate(float area, float pressureStart, float pressureEnd, float density, float time) { float diff = -2f * (pressureEnd - pressureStart); + if (diff == 0) return 0f; return (area * (diff/Math.abs(diff)) * Mathf.sqrt(Math.abs(diff) / density) * time * density)/(60f); } } diff --git a/src/omaloon/ui/dialogs/EventHints.java b/src/omaloon/ui/dialogs/EventHints.java index 904862b2..b560ed27 100644 --- a/src/omaloon/ui/dialogs/EventHints.java +++ b/src/omaloon/ui/dialogs/EventHints.java @@ -7,18 +7,17 @@ import mindustry.*; import mindustry.ui.fragments.HintsFragment.*; import omaloon.content.blocks.*; -import omaloon.world.interfaces.*; public enum EventHints implements Hint { - drill_positive_pressure( - () -> false, - () -> Vars.state.teams.get(Vars.state.rules.defaultTeam).getBuildings(OlProductionBlocks.hammerDrill).find(b -> ((HasPressure) b).getPressure() > 0f) != null - ), - press_or_shelter_negative_pressure( - () -> false, - () -> Vars.state.teams.get(Vars.state.rules.defaultTeam).getBuildings(OlCraftingBlocks.carborundumPress).find(b -> ((HasPressure) b).getPressure() < 0f) != null - || Vars.state.teams.get(Vars.state.rules.defaultTeam).getBuildings(OlDefenceBlocks.smallShelter).find(b -> ((HasPressure) b).getPressure() < 0f) != null - ), +// drill_positive_pressure( +// () -> false, +// () -> Vars.state.teams.get(Vars.state.rules.defaultTeam).getBuildings(OlProductionBlocks.hammerDrill).find(b -> ((HasPressure) b).getPressure() > 0f) != null +// ), +// press_or_shelter_negative_pressure( +// () -> false, +// () -> Vars.state.teams.get(Vars.state.rules.defaultTeam).getBuildings(OlCraftingBlocks.carborundumPress).find(b -> ((HasPressure) b).getPressure() < 0f) != null +// || Vars.state.teams.get(Vars.state.rules.defaultTeam).getBuildings(OlDefenceBlocks.smallShelter).find(b -> ((HasPressure) b).getPressure() < 0f) != null +// ), pump( () -> false, () -> !Vars.state.teams.get(Vars.state.rules.defaultTeam).getBuildings(OlDistributionBlocks.liquidPump).isEmpty() @@ -27,11 +26,6 @@ public enum EventHints implements Hint { () -> false, () -> !Vars.state.teams.get(Vars.state.rules.defaultTeam).getBuildings(OlDistributionBlocks.liquidValve).isEmpty(), pump - ), - low_pressure( - () -> !Vars.state.teams.get(Vars.state.rules.defaultTeam).getBuildings(OlDistributionBlocks.liquidValve).isEmpty(), - () -> Vars.state.teams.get(Vars.state.rules.defaultTeam).buildings.contains( - b -> b instanceof HasPressure pressure && pressure.getPressure() < 0) ); final Boolp complete; diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidBridge.java b/src/omaloon/world/blocks/liquid/PressureLiquidBridge.java index 7adc9ab8..59f31ed0 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidBridge.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidBridge.java @@ -204,8 +204,8 @@ public void draw() { } @Override - public Seq nextBuilds(boolean flow) { - Seq o = HasPressure.super.nextBuilds(flow); + public Seq nextBuilds() { + Seq o = HasPressure.super.nextBuilds(); if (Vars.world.build(link) instanceof PressureLiquidBridgeBuild b) o.add(b); for(int pos : incoming.items) if (Vars.world.build(pos) instanceof PressureLiquidBridgeBuild b) o.add(b); return o; diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidJunction.java b/src/omaloon/world/blocks/liquid/PressureLiquidJunction.java index e2870bfb..1462277a 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidJunction.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidJunction.java @@ -48,7 +48,7 @@ public HasPressure getPressureDestination(HasPressure source, float pressure) { } @Override - public Seq nextBuilds(boolean flow) { + public Seq nextBuilds() { return Seq.with(); } diff --git a/src/omaloon/world/consumers/ConsumeFluid.java b/src/omaloon/world/consumers/ConsumeFluid.java index ccfef804..be2b3240 100644 --- a/src/omaloon/world/consumers/ConsumeFluid.java +++ b/src/omaloon/world/consumers/ConsumeFluid.java @@ -92,7 +92,7 @@ public float efficiencyMultiplier(Building build) { public boolean shouldConsume(HasPressure build) { if (startRange == endRange) return true; - return startRange <= build.getPressure() && build.getPressure() <= endRange && (fluid == null || build.pressure().liquids[fluid.id] > amount); + return startRange <= build.pressure().getPressure(fluid) && build.pressure().getPressure(fluid) <= endRange && (fluid == null || build.pressure().liquids[fluid.id] > amount); } @Override public void trigger(Building build) { diff --git a/src/omaloon/world/interfaces/HasPressure.java b/src/omaloon/world/interfaces/HasPressure.java index e7ea75e0..88ffb70e 100644 --- a/src/omaloon/world/interfaces/HasPressure.java +++ b/src/omaloon/world/interfaces/HasPressure.java @@ -40,13 +40,6 @@ default boolean connects(HasPressure to) { return pressureConfig().outputsPressure || pressureConfig().acceptsPressure; } - /** - * @return current pressure of the building - */ - default float getPressure() { - return pressure().pressure; - } - /** * @return building destination to dump pressure */ @@ -63,9 +56,9 @@ default HasPressure getPressureDestination(HasPressure from, float pressure) { } /** - * @param flow determines if the returned value will have only builds to which it can flow pressure to + * Returns the next builds that this block will connect to */ - default Seq nextBuilds(boolean flow) { + default Seq nextBuilds() { return proximity().select( b -> b instanceof HasPressure ).as().map( diff --git a/src/omaloon/world/meta/PressureSection.java b/src/omaloon/world/meta/PressureSection.java index 3822d751..6fc1fe2b 100644 --- a/src/omaloon/world/meta/PressureSection.java +++ b/src/omaloon/world/meta/PressureSection.java @@ -42,7 +42,7 @@ public void mergeFlood(HasPressure other) { while(!tmp.isEmpty()) { HasPressure next = tmp.pop(); tmp2.addUnique(next); - next.nextBuilds(false).each(b -> { + next.nextBuilds().each(b -> { if (b.getSectionDestination(next) != null && !tmp2.contains(b.getSectionDestination(next))) { tmp.add(b.getSectionDestination(next)); } diff --git a/src/omaloon/world/modules/PressureModule.java b/src/omaloon/world/modules/PressureModule.java index 3caec27e..bc4cb48e 100644 --- a/src/omaloon/world/modules/PressureModule.java +++ b/src/omaloon/world/modules/PressureModule.java @@ -39,6 +39,14 @@ public void addFluid(@Nullable Liquid liquid, float amount, PressureConfig refer if (liquid != null) current = liquid; } + public float get(@Nullable Liquid liquid) { + if (liquid == null) { + return air; + } else { + return liquids[liquid.id]; + } + } + public @Nullable Liquid getMain() { Liquid out = null; for(int i = 0; i < liquids.length; i++) { From 1f678c9beb4f86eed9fced13807369345b3263c2 Mon Sep 17 00:00:00 2001 From: Elizabeth Aurora <84468589+uujuju1@users.noreply.github.com> Date: Mon, 6 Jan 2025 22:03:11 -0300 Subject: [PATCH 21/54] Revert "Fix EntityAnno" --- .github/workflows/ci.yml | 42 ------ .github/workflows/commit.yml | 24 ++++ .github/workflows/pr.yml | 24 ++++ .gitignore | 5 +- README.md | 22 ++- build.gradle | 223 +++++++++++++++++++++++++++++++ build.gradle.kts | 237 --------------------------------- gradle.properties | 10 +- settings.gradle | 13 ++ settings.gradle.kts | 18 --- src/omaloon/utils/OlUtils.java | 4 +- 11 files changed, 301 insertions(+), 321 deletions(-) delete mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/commit.yml create mode 100644 .github/workflows/pr.yml create mode 100644 build.gradle delete mode 100644 build.gradle.kts create mode 100644 settings.gradle delete mode 100644 settings.gradle.kts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 9fecb912..00000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: Omaloon Build CI - -on: - push: - pull_request: - release: - types: - - created - -permissions: - contents: write - -jobs: - buildJar: - name: Build and Publish Jar - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Set up JDK 17 - uses: actions/setup-java@v4 - with: - java-version: 17 - distribution: temurin - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v4 - - name: Build mod artifact - run: | - chmod +x gradlew - ./gradlew clean dex - - name: Upload built mod artifact as a GitHub Action artifact - uses: actions/upload-artifact@v4 - if: github.event_name == 'push' || github.event_name == 'pull_request' - with: - name: Omaloon (zipped) - path: build/libs/Omaloon.jar - if-no-files-found: error - compression-level: 0 - - name: Upload built mod artifact into release - uses: softprops/action-gh-release@v2 - if: github.event_name == 'release' && github.event.action == 'created' - with: - files: build/libs/Omaloon.jar \ No newline at end of file diff --git a/.github/workflows/commit.yml b/.github/workflows/commit.yml new file mode 100644 index 00000000..ca713486 --- /dev/null +++ b/.github/workflows/commit.yml @@ -0,0 +1,24 @@ +name: Omaloon Commit + +on: [push] + +jobs: + buildJar: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Set up PATH + run: | + echo "${ANDROID_HOME}/build-tools/30.0.1" >> $GITHUB_PATH + - name: Set up JDK 17 + uses: actions/setup-java@v1 + with: + java-version: 17 + - name: Build mod jar + run: ./gradlew clean dex + - name: Upload built jar file + uses: actions/upload-artifact@v4 + with: + name: ${{ github.event.repository.name }} + path: build/libs/${{ github.event.repository.name }}.jar diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml new file mode 100644 index 00000000..1f190b22 --- /dev/null +++ b/.github/workflows/pr.yml @@ -0,0 +1,24 @@ +name: Omaloon Pull Request + +on: [pull_request] + +jobs: + buildJar: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Set up PATH + run: | + echo "${ANDROID_HOME}/build-tools/30.0.1" >> $GITHUB_PATH + - name: Set up JDK 17 + uses: actions/setup-java@v1 + with: + java-version: 17 + - name: Build mod jar + run: ./gradlew clean dex + - name: Upload built jar file + uses: actions/upload-artifact@v4 + with: + name: ${{ github.event.repository.name }} Pull Request + path: build/libs/${{ github.event.repository.name }}.jar diff --git a/.gitignore b/.gitignore index d3d0d568..0369c8d4 100644 --- a/.gitignore +++ b/.gitignore @@ -148,7 +148,4 @@ gradle-app.setting Thumbs.db android/libs/ /.run/*.run.xml -modsDirectories.txt - -# Mindustry Client -/run/ \ No newline at end of file +modsDirectories.txt \ No newline at end of file diff --git a/README.md b/README.md index 31f498e0..19838e62 100644 --- a/README.md +++ b/README.md @@ -7,9 +7,7 @@ [![Download](https://img.shields.io/github/v/release/xStaBUx/Omaloon-mod-public?color=6aa84f&include_prereleases&label=Latest%20version&logo=github&logoColor=white&style=for-the-badge)](https://github.com/xStaBUx/Omaloon-mod-public/releases) [![Total Downloads](https://img.shields.io/github/downloads/xStaBUx/Omaloon-mod-public/total?color=7289da&label&logo=docusign&logoColor=white&style=for-the-badge)](https://github.com/xStaBUx/Omaloon-mod-public/releases) -> An ambitious [Mindustry](https://github.com/Anuken/Mindustry) mod -developed by [stabu](https://github.com/stabu-dev) and [uujuju](https://github.com/uujuju1). -Mod aimed at expanding a campaign by adding a new star system. +An ambitious [Mindustry](https://github.com/Anuken/Mindustry) modification developed by stabu and uujuju. This mod aims to expand the game's standard campaign by adding a new star system. ## Building from Source @@ -47,9 +45,13 @@ The built mod will be in the `build/libs` directory. To test the mod directly: ```bash -gradlew runClient +gradlew run +``` + +To install the mod to your Mindustry mods folder: +```bash +gradlew installJar ``` -This Mindustry client uses the `run` directory to store its data. ## Contributing @@ -60,18 +62,12 @@ This Mindustry client uses the `run` directory to store its data. ### Feature Suggestions - Join our [Discord server](https://discord.gg/bNMT82Hswb) to suggest new content -- Provide examples and specific arguments why your suggestion should be added to Omaloon - The Issues section is reserved for bug reports only -### Game-play Feedback -- Share your thoughts on game-play and balancing in our Discord +### Balance Feedback +- Share your thoughts on content balancing in our Discord - Provide specific examples and reasoning for balance changes -### Pull Requests -- Improve Omaloon's code/sprites/localization and propose these changes to us by creating a [Pull Request](https://github.com/stabu-dev/Omaloon/pulls). -- Make sure your code works properly and doesn't cause any issues. -- Provide specific reasoning why your Pull Request should be accepted. - ## Credits ### Developers diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000..98322657 --- /dev/null +++ b/build.gradle @@ -0,0 +1,223 @@ +import arc.files.* +import arc.util.* + +import java.util.regex.* + +buildscript{ + dependencies{ + classpath "com.github.Anuken.Arc:arc-core:$arcVersion" + } + + repositories{ + mavenCentral() + maven{url 'https://oss.sonatype.org/content/repositories/snapshots/'} + maven{url 'https://oss.sonatype.org/content/repositories/releases/'} + maven{url 'https://raw.githubusercontent.com/Zelaux/MindustryRepo/master/repository'} + maven{url 'https://jitpack.io'} + } +} + +plugins{ + // Register `EntityAnno` plugin, but only apply on `rootProject`. + id 'java' + id 'com.github.GlennFolker.EntityAnno' version "$entVersion" apply false +} + +configure(allprojects){ + sourceSets.main.java.srcDirs = [layout.projectDirectory.dir('src')] + + ext{ + compilerVersion = JavaVersion.current().ordinal() - JavaVersion.VERSION_17.ordinal() + 17 + useJitpack = Boolean.valueOf(mindustryBE) + + arc = {String module -> + return "com.github.Anuken.Arc$module:$arcVersion" + } + arcLibrary = {String module -> + return "com.github.Zelaux.ArcLibrary$module:$arcLibraryVersion" + } + mindustry = {String module -> + return "com.github.Anuken.Mindustry$module:$mindustryVersion" + } + } + + configurations.configureEach{ + // Resolve the correct Mindustry dependency, and force Arc version. + resolutionStrategy.eachDependency{ + if(useJitpack && requested.group == 'com.github.Anuken.Mindustry'){ + useTarget "com.github.Anuken.MindustryJitpack:$it.requested.name:$mindustryBEVersion" + } + + if(requested.group == 'com.github.Anuken.Arc'){ + useVersion arcVersion + } + } + } + + dependencies{ + // Downgrade Java 9+ syntax into being available in Java 8. + annotationProcessor "com.github.GlennFolker.EntityAnno:downgrader:$entVersion" + } + + repositories{ + // Necessary Maven repositories to pull dependencies from. + mavenCentral() + maven{url 'https://oss.sonatype.org/content/repositories/snapshots/'} + maven{url 'https://oss.sonatype.org/content/repositories/releases/'} + + // Use Zelaux's non-buggy repository for release Mindustry and Arc builds. + if(!useJitpack) maven{url 'https://raw.githubusercontent.com/Zelaux/MindustryRepo/master/repository'} + maven{url 'https://raw.githubusercontent.com/Zelaux/Repo/master/repository'}//for ArcLibrary + maven{url 'https://jitpack.io'} + } + + tasks.withType(JavaCompile).configureEach{ + // Use Java 17+ syntax, but target Java 8 bytecode version. + sourceCompatibility = compilerVersion + options.release.set 8 + options.compilerArgs << '-Xlint:-options' + + options.incremental = true + options.encoding = 'UTF-8' + } +} + +configure(rootProject){ + // Apply `EntityAnno` plugin to integrate the annotation processors. + apply plugin: 'com.github.GlennFolker.EntityAnno' + + entityAnno{ + modName = property('modName') + mindustryVersion = property(useJitpack ? 'mindustryBEVersion' : 'mindustryVersion') + isJitpack = useJitpack + revisionDir = layout.projectDirectory.dir('revisions').asFile + fetchPackage = modFetch + genSrcPackage = modGenSrc + genPackage = modGen + } + + dependencies{ + // Use the entity generation annotation processor. + compileOnly "com.github.GlennFolker.EntityAnno:entity:$entVersion" + kapt "com.github.GlennFolker.EntityAnno:entity:$entVersion" + + compileOnly "org.jetbrains:annotations:24.0.1" + + // Depend on Mindustry/Arc classpath. + compileOnly "${mindustry(':core')}" + compileOnly "${arc(':arc-core')}" + implementation "${arcLibrary(':graphics-draw3d')}" + implementation "${arcLibrary(':graphics-dashDraw')}" + implementation "${arcLibrary(':graphics-extendedDraw')}" + } + + jar{ + archiveFileName = "${modArtifact}Desktop.jar" + + from files(sourceSets.main.output.classesDirs) + from files(sourceSets.main.output.resourcesDir) + from configurations.runtimeClasspath.collect{it.isDirectory() ? it : zipTree(it)} + + from files(layout.projectDirectory.dir('assets')) + from(layout.projectDirectory){ + include 'mod.json' + include 'icon.png' + } + + doFirst{ + def name = Pattern + .compile('"name": "(.*)"') + .matcher(layout.projectDirectory.file('mod.json').asFile.text) + + if(name.find() && name.group(1) != modName){ + logger.log(LogLevel.WARN, "Mod name mismatch: '${name.group(1)}' (mod.json) != '$modName' (gradle.properties)") + } + } + } + + tasks.register('dex', Jar){ + inputs.files tasks.jar + archiveFileName = "${modArtifact}.jar" + + final def desktopJar = tasks.jar.archiveFile + final def dexJar = file("$temporaryDir/Dexed.jar") + + from zipTree(desktopJar), zipTree(dexJar) + doFirst{ + // Find Android SDK root. + def sdkRoot = file( + System.getenv('ANDROID_SDK_ROOT') ?: System.getenv('ANDROID_HOME') ?: + { throw new GradleException('Neither `ANDROID_SDK_ROOT` nor `ANDROID_HOME` is set') } + ) + + // Find `d8`. + def d8 = file("$sdkRoot/build-tools/$androidBuildVersion/d8") + if(!d8.exists()){ + throw new GradleException("Android SDK `build-tools;$androidBuildVersion` isn't installed or is corrupted") + } + + // Initialize a release build. + def input = desktopJar.get().asFile + def command = "$d8 --release --min-api $androidMinVersion --output $dexJar $input" + + // Include all compile and runtime classpath. + (configurations.compileClasspath.asList() + configurations.runtimeClasspath.asList()).forEach{ + if(it.exists()) command = "$command --classpath $it" + } + + // Include Android platform as library. + def androidJar = file("$sdkRoot/platforms/android-$androidSdkVersion/android.jar") + if(!androidJar.exists()){ + throw new GradleException("Android SDK `platforms;android-$androidSdkVersion` isn't installed or is corrupted") + } + + command = "$command --lib $androidJar" + if(OS.isWindows) command = "cmd /c $command" + + // Run `d8`. + logger.log(LogLevel.LIFECYCLE, 'Running `d8`.') + command.execute(null, layout.projectDirectory.asFile).waitForProcessOutput(System.out, System.err) + } + } +} + +tasks.register('installJar'){ + dependsOn tasks.jar + doLast{ + def folder = Fi.get(OS.getAppDataDirectoryString('Mindustry')).child('mods') + folder.mkdirs() + + folder.child(tasks.jar.archiveFileName.get()).delete() + folder.child(tasks.dex.archiveFileName.get()).delete() + + def jarOutput = new Fi(tasks.jar.archiveFile.get().asFile) + def dexOutput = new Fi(tasks.dex.archiveFile.get().asFile) + + if(!jarOutput.exists() && !dexOutput.exists()){ + logger.log(LogLevel.ERROR, 'Neither :jar nor :dex artifacts are found; run one of these tasks first.') + }else if(dexOutput.exists()){ + dexOutput.copyTo(folder) + logger.log(LogLevel.LIFECYCLE, "Copied :dex output to $folder.") + }else{ + jarOutput.copyTo(folder) + logger.log(LogLevel.LIFECYCLE, "Copied :jar output to $folder.") + } + } +} + +tasks.register('run'){ + dependsOn installJar + doLast{ + def gamePath = "${temporaryDir.absolutePath}\\Mindustry${mindustryVersion}.jar" + def gameUrl = mindustryVersion.startsWith("v") ? + "https://github.com/Anuken/Mindustry/releases/download/${mindustryVersion}/Mindustry.jar" : + "https://github.com/Anuken/MindustryBuilds/releases/download/${mindustryVersion}/Mindustry-BE-Desktop-${mindustryVersion}.jar" + def gameFile = new File(gamePath) + if (!gameFile.exists()) { + println "Downloading Mindustry ${mindustryVersion} from ${gameUrl} to ${gamePath}" + new URL(gameUrl).withInputStream{ i -> gameFile.withOutputStream{ it << i } } + println "Done" + } + javaexec{ classpath = files(gamePath) } + } +} \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts deleted file mode 100644 index 5c7dc768..00000000 --- a/build.gradle.kts +++ /dev/null @@ -1,237 +0,0 @@ -import arc.util.* -import arc.util.serialization.* -import de.undercouch.gradle.tasks.download.Download -import ent.* -import java.io.* - -buildscript{ - val arcVersion: String by project - val useJitpack = property("mindustryBE").toString().toBooleanStrict() - - dependencies{ - classpath("com.github.Anuken.Arc:arc-core:$arcVersion") - } - - repositories{ - if(!useJitpack) maven("https://raw.githubusercontent.com/Zelaux/MindustryRepo/master/repository") - maven("https://jitpack.io") - } -} - -plugins{ - java - id("de.undercouch.download") version "5.4.0" - id("com.github.GlennFolker.EntityAnno") apply false -} - -val arcVersion: String by project -val arcLibraryVersion: String by project -val mindustryVersion: String by project -val mindustryBEVersion: String by project -val entVersion: String by project - -val modName: String by project -val modArtifact: String by project -val modFetch: String by project -val modGenSrc: String by project -val modGen: String by project - -val androidSdkVersion: String by project -val androidBuildVersion: String by project -val androidMinVersion: String by project - -val useJitpack = property("mindustryBE").toString().toBooleanStrict() - -fun arc(module: String): String{ - return "com.github.Anuken.Arc$module:$arcVersion" -} - -fun arcLibrary(module: String):String{ - return "com.github.Zelaux.ArcLibrary$module:$arcLibraryVersion" -} - -fun mindustry(module: String): String{ - return "com.github.Anuken.Mindustry$module:$mindustryVersion" -} - -fun entity(module: String): String{ - return "com.github.GlennFolker.EntityAnno$module:$entVersion" -} - -allprojects{ - apply(plugin = "java") - sourceSets["main"].java.setSrcDirs(listOf(layout.projectDirectory.dir("src"))) - - configurations.configureEach{ - // Resolve the correct Mindustry dependency, and force Arc version. - resolutionStrategy.eachDependency{ - if(useJitpack && requested.group == "com.github.Anuken.Mindustry"){ - useTarget("com.github.Anuken.MindustryJitpack:${requested.module.name}:$mindustryBEVersion") - }else if(requested.group == "com.github.Anuken.Arc"){ - useVersion(arcVersion) - } - } - } - - dependencies{ - // Downgrade Java 9+ syntax into being available in Java 8. - annotationProcessor(entity(":downgrader")) - } - - repositories{ - // Necessary Maven repositories to pull dependencies from. - mavenCentral() - maven("https://oss.sonatype.org/content/repositories/snapshots/") - maven("https://oss.sonatype.org/content/repositories/releases/") - maven("https://raw.githubusercontent.com/GlennFolker/EntityAnnoMaven/main") - - // Use Zelaux's non-buggy repository for release Mindustry and Arc builds. - if(!useJitpack) maven("https://raw.githubusercontent.com/Zelaux/MindustryRepo/master/repository") - maven("https://raw.githubusercontent.com/Zelaux/Repo/master/repository")//for ArcLibrary - maven("https://jitpack.io") - } - - tasks.withType().configureEach{ - // Use Java 17+ syntax, but target Java 8 bytecode version. - sourceCompatibility = "17" - options.apply{ - release = 8 - compilerArgs.add("-Xlint:-options") - - isIncremental = true - encoding = "UTF-8" - } - } -} - -project(":"){ - apply(plugin = "com.github.GlennFolker.EntityAnno") - configure{ - modName = project.properties["modName"].toString() - mindustryVersion = project.properties[if(useJitpack) "mindustryBEVersion" else "mindustryVersion"].toString() - isJitpack = useJitpack - revisionDir = layout.projectDirectory.dir("revisions").asFile - fetchPackage = modFetch - genSrcPackage = modGenSrc - genPackage = modGen - } - - dependencies{ - // Use the entity generation annotation processor. - compileOnly(entity(":entity")) - add("kapt", entity(":entity")) - - compileOnly("org.jetbrains:annotations:24.0.1") - - compileOnly(mindustry(":core")) - compileOnly(arc(":arc-core")) - implementation(arcLibrary(":graphics-draw3d")) - implementation(arcLibrary(":graphics-dashDraw")) - implementation(arcLibrary(":graphics-extendedDraw")) - } - - val jar = tasks.named("jar"){ - archiveFileName = "${modArtifact}Desktop.jar" - - val meta = layout.projectDirectory.file("$temporaryDir/mod.json") - from( - files(sourceSets["main"].output.classesDirs), - files(sourceSets["main"].output.resourcesDir), - configurations.runtimeClasspath.map{conf -> conf.map{if(it.isDirectory) it else zipTree(it)}}, - - files(layout.projectDirectory.dir("assets")), - layout.projectDirectory.file("icon.png"), - meta - ) - - metaInf.from(layout.projectDirectory.file("LICENSE")) - doFirst{ - // Deliberately check if the mod meta is actually written in HJSON, since, well, some people actually use - // it. But this is also not mentioned in the `README.md`, for the mischievous reason of driving beginners - // into using JSON instead. - val metaJson = layout.projectDirectory.file("mod.json") - val metaHjson = layout.projectDirectory.file("mod.hjson") - - if(metaJson.asFile.exists() && metaHjson.asFile.exists()){ - throw IllegalStateException("Ambiguous mod meta: both `mod.json` and `mod.hjson` exist.") - }else if(!metaJson.asFile.exists() && !metaHjson.asFile.exists()){ - throw IllegalStateException("Missing mod meta: neither `mod.json` nor `mod.hjson` exist.") - } - - val isJson = metaJson.asFile.exists() - val map = (if(isJson) metaJson else metaHjson).asFile - .reader(Charsets.UTF_8) - .use{Jval.read(it)} - - map.put("name", modName) - meta.asFile.writer(Charsets.UTF_8).use{file -> BufferedWriter(file).use{map.writeTo(it, Jval.Jformat.formatted)}} - } - } - - tasks.register("dex"){ - inputs.files(jar) - archiveFileName = "$modArtifact.jar" - - val desktopJar = jar.flatMap{it.archiveFile} - val dexJar = File(temporaryDir, "Dex.jar") - - from(zipTree(desktopJar), zipTree(dexJar)) - doFirst{ - logger.lifecycle("Running `d8`.") - providers.exec{ - // Find Android SDK root. - val sdkRoot = File( - OS.env("ANDROID_SDK_ROOT") ?: OS.env("ANDROID_HOME") ?: - throw IllegalStateException("Neither `ANDROID_SDK_ROOT` nor `ANDROID_HOME` is set.") - ) - - // Find `d8`. - val d8 = File(sdkRoot, "build-tools/$androidBuildVersion/${if(OS.isWindows) "d8.bat" else "d8"}") - if(!d8.exists()) throw IllegalStateException("Android SDK `build-tools;$androidBuildVersion` isn't installed or is corrupted") - - // Initialize a release build. - val input = desktopJar.get().asFile - val command = arrayListOf("$d8", "--release", "--min-api", androidMinVersion, "--output", "$dexJar", "$input") - - // Include all compile and runtime classpath. - (configurations.compileClasspath.get().toList() + configurations.runtimeClasspath.get().toList()).forEach{ - if(it.exists()) command.addAll(arrayOf("--classpath", it.path)) - } - - // Include Android platform as library. - val androidJar = File(sdkRoot, "platforms/android-$androidSdkVersion/android.jar") - if(!androidJar.exists()) throw IllegalStateException("Android SDK `platforms;android-$androidSdkVersion` isn't installed or is corrupted") - - command.addAll(arrayOf("--lib", "$androidJar")) - if(OS.isWindows) command.addAll(0, arrayOf("cmd", "/c").toList()) - - // Run `d8`. - commandLine(command) - }.result.get().rethrowFailure() - } - } - - tasks.register("fetchClient") { - src("https://github.com/Anuken/Mindustry/releases/download/$mindustryVersion/Mindustry.jar") - dest(file("$rootDir/run/Mindustry.jar")) - overwrite(false) - } - - tasks.register("runClient") { - dependsOn("fetchClient") - dependsOn("jar") - - val modFilename = "${project.name}Desktop.jar" - doFirst { - copy { - from("$rootDir/build/libs/$modFilename") - into("$rootDir/run/mods") - rename { modFilename } - } - } - - environment("MINDUSTRY_DATA_DIR", "$rootDir/run") - classpath(files("$rootDir/run/Mindustry.jar")) - mainClass.set("mindustry.desktop.DesktopLauncher") - } -} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 8e93fe38..7c240f48 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,7 +13,7 @@ modArtifact = Omaloon # EntityAnno version, for integrating syntax-downgrader and entity annotation processor. # The exact version you need should be looked up on the project's `README.md` # (see https://github.com/GlennFolker/EntityAnno?tab=readme-ov-file#version-compatibility). -entVersion = v146.0.10 +entVersion = v146.0.8 # Set to `true` if the mod is compiled against Mindustry bleeding-edge build. # See documents on `mindustryVersion` and `mindustryBEVersion`. mindustryBE = false @@ -23,16 +23,16 @@ mindustryVersion = v146 # Mindustry *bleeding-edge* version, corresponds to commit hashes of Anuken/MindustryJitpack, e.g. `345ea0d54de0aee6953a664468556f4fea1a7c4f`. # Leave empty if `mindustryBE = false`. mindustryBEVersion = -# Arc version should either follow `mindustryVersion` for release or whatever hash bleeding-edge Mindustry uses. +# Arc version, should either follow `mindustryVersion` for release or whatever hash bleeding-edge Mindustry uses. arcVersion = v146 # Arc library version, has some things that omaloon needs -arcLibraryVersion = v1.0.7 +arcLibraryVersion = v1.0.5.1 ##### Android SDK configuration for building Android artifacts. # Android platform SDK version. -androidSdkVersion = 35 +androidSdkVersion = 34 # Android build-tools version. -androidBuildVersion = 35.0.0 +androidBuildVersion = 34.0.0 # Android platform minimum API version. Should be left as 14, as that's what Mindustry officially supports. androidMinVersion = 14 diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 00000000..d556a4a1 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,13 @@ +pluginManagement{ + repositories{ + gradlePluginPortal() + maven{url 'https://jitpack.io'} + } +} + +if(JavaVersion.current().ordinal() < JavaVersion.VERSION_17.ordinal()){ + throw new GradleException("JDK 17 is a required minimum version. Yours: ${System.getProperty('java.version')}") +} + +rootProject.name = 'Omaloon' + diff --git a/settings.gradle.kts b/settings.gradle.kts deleted file mode 100644 index b1b496b3..00000000 --- a/settings.gradle.kts +++ /dev/null @@ -1,18 +0,0 @@ -pluginManagement{ - repositories{ - gradlePluginPortal() - maven("https://raw.githubusercontent.com/GlennFolker/EntityAnnoMaven/main") - } - - plugins{ - val entVersion: String by settings - id("com.github.GlennFolker.EntityAnno") version(entVersion) - } -} - -if(JavaVersion.current().ordinal < JavaVersion.VERSION_17.ordinal){ - throw IllegalStateException("JDK 17 is a required minimum version. Yours: ${System.getProperty("java.version")}") -} - -val modName: String by settings -rootProject.name = modName \ No newline at end of file diff --git a/src/omaloon/utils/OlUtils.java b/src/omaloon/utils/OlUtils.java index bec2ea64..6d26bc9e 100644 --- a/src/omaloon/utils/OlUtils.java +++ b/src/omaloon/utils/OlUtils.java @@ -3,8 +3,8 @@ import arc.func.*; import arc.graphics.g2d.*; import arc.struct.*; -import mindustry.type.*; -import omaloon.ui.*; +import mindustry.type.Item; +import omaloon.ui.MultiItemData; import org.jetbrains.annotations.*; import static arc.Core.*; From 52ee995ed7103c0854973d046827566e08ae8a2b Mon Sep 17 00:00:00 2001 From: = Date: Tue, 7 Jan 2025 00:18:31 -0300 Subject: [PATCH 22/54] lemme just this real quick --- .../content/blocks/OlProductionBlocks.java | 19 +------------------ .../blocks/sandbox/PressureLiquidVoid.java | 3 --- 2 files changed, 1 insertion(+), 21 deletions(-) diff --git a/src/omaloon/content/blocks/OlProductionBlocks.java b/src/omaloon/content/blocks/OlProductionBlocks.java index 9a683828..9f4cd80b 100644 --- a/src/omaloon/content/blocks/OlProductionBlocks.java +++ b/src/omaloon/content/blocks/OlProductionBlocks.java @@ -1,10 +1,8 @@ package omaloon.content.blocks; -import arc.math.*; import mindustry.entities.effect.*; import mindustry.type.*; import mindustry.world.*; -import mindustry.world.draw.*; import omaloon.content.*; import omaloon.world.blocks.production.*; import omaloon.world.consumers.*; @@ -13,7 +11,7 @@ public class OlProductionBlocks { public static Block - hammerDrill, pressurizer, + hammerDrill, end; @@ -47,20 +45,5 @@ public static void load(){ ); }}); }}; - - pressurizer = new Pressurizer("air-well") {{ - requirements(Category.production, with( - OlItems.cobalt, 10 - )); - outputPressure = 5f; - - drawer = new DrawMulti( - new DrawDefault(), - new DrawTransition() {{ - suffix = "-cap"; - interp = a -> Interp.sine.apply(Interp.slope.apply(a)); - }} - ); - }}; } } diff --git a/src/omaloon/world/blocks/sandbox/PressureLiquidVoid.java b/src/omaloon/world/blocks/sandbox/PressureLiquidVoid.java index 344cfbc3..78448c39 100644 --- a/src/omaloon/world/blocks/sandbox/PressureLiquidVoid.java +++ b/src/omaloon/world/blocks/sandbox/PressureLiquidVoid.java @@ -20,9 +20,6 @@ public class PressureLiquidVoidBuild extends LiquidVoidBuild implements HasPress @Override public boolean acceptLiquid(Building source, Liquid liquid) { return enabled; } - @Override public boolean acceptsPressure(HasPressure from, float pressure) { - return enabled; - } @Override public PressureModule pressure() { return pressure; From 9916f17d8a5ed0d0ddc71d91515d66832f8b17f5 Mon Sep 17 00:00:00 2001 From: xstabux Date: Mon, 6 Jan 2025 17:47:57 +0200 Subject: [PATCH 23/54] Fix EntityAnno (cherry picked from commit 9e304d46cd4397e5e50596a388419477e662ed37) --- .github/workflows/ci.yml | 42 ++++++ .github/workflows/commit.yml | 24 ---- .github/workflows/pr.yml | 24 ---- .gitignore | 5 +- README.md | 22 +-- build.gradle | 223 ------------------------------- build.gradle.kts | 237 +++++++++++++++++++++++++++++++++ gradle.properties | 10 +- settings.gradle | 13 -- settings.gradle.kts | 18 +++ src/omaloon/utils/OlUtils.java | 4 +- 11 files changed, 321 insertions(+), 301 deletions(-) create mode 100644 .github/workflows/ci.yml delete mode 100644 .github/workflows/commit.yml delete mode 100644 .github/workflows/pr.yml delete mode 100644 build.gradle create mode 100644 build.gradle.kts delete mode 100644 settings.gradle create mode 100644 settings.gradle.kts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..9fecb912 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,42 @@ +name: Omaloon Build CI + +on: + push: + pull_request: + release: + types: + - created + +permissions: + contents: write + +jobs: + buildJar: + name: Build and Publish Jar + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: 17 + distribution: temurin + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 + - name: Build mod artifact + run: | + chmod +x gradlew + ./gradlew clean dex + - name: Upload built mod artifact as a GitHub Action artifact + uses: actions/upload-artifact@v4 + if: github.event_name == 'push' || github.event_name == 'pull_request' + with: + name: Omaloon (zipped) + path: build/libs/Omaloon.jar + if-no-files-found: error + compression-level: 0 + - name: Upload built mod artifact into release + uses: softprops/action-gh-release@v2 + if: github.event_name == 'release' && github.event.action == 'created' + with: + files: build/libs/Omaloon.jar \ No newline at end of file diff --git a/.github/workflows/commit.yml b/.github/workflows/commit.yml deleted file mode 100644 index ca713486..00000000 --- a/.github/workflows/commit.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: Omaloon Commit - -on: [push] - -jobs: - buildJar: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - name: Set up PATH - run: | - echo "${ANDROID_HOME}/build-tools/30.0.1" >> $GITHUB_PATH - - name: Set up JDK 17 - uses: actions/setup-java@v1 - with: - java-version: 17 - - name: Build mod jar - run: ./gradlew clean dex - - name: Upload built jar file - uses: actions/upload-artifact@v4 - with: - name: ${{ github.event.repository.name }} - path: build/libs/${{ github.event.repository.name }}.jar diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml deleted file mode 100644 index 1f190b22..00000000 --- a/.github/workflows/pr.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: Omaloon Pull Request - -on: [pull_request] - -jobs: - buildJar: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - name: Set up PATH - run: | - echo "${ANDROID_HOME}/build-tools/30.0.1" >> $GITHUB_PATH - - name: Set up JDK 17 - uses: actions/setup-java@v1 - with: - java-version: 17 - - name: Build mod jar - run: ./gradlew clean dex - - name: Upload built jar file - uses: actions/upload-artifact@v4 - with: - name: ${{ github.event.repository.name }} Pull Request - path: build/libs/${{ github.event.repository.name }}.jar diff --git a/.gitignore b/.gitignore index 0369c8d4..d3d0d568 100644 --- a/.gitignore +++ b/.gitignore @@ -148,4 +148,7 @@ gradle-app.setting Thumbs.db android/libs/ /.run/*.run.xml -modsDirectories.txt \ No newline at end of file +modsDirectories.txt + +# Mindustry Client +/run/ \ No newline at end of file diff --git a/README.md b/README.md index 19838e62..31f498e0 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,9 @@ [![Download](https://img.shields.io/github/v/release/xStaBUx/Omaloon-mod-public?color=6aa84f&include_prereleases&label=Latest%20version&logo=github&logoColor=white&style=for-the-badge)](https://github.com/xStaBUx/Omaloon-mod-public/releases) [![Total Downloads](https://img.shields.io/github/downloads/xStaBUx/Omaloon-mod-public/total?color=7289da&label&logo=docusign&logoColor=white&style=for-the-badge)](https://github.com/xStaBUx/Omaloon-mod-public/releases) -An ambitious [Mindustry](https://github.com/Anuken/Mindustry) modification developed by stabu and uujuju. This mod aims to expand the game's standard campaign by adding a new star system. +> An ambitious [Mindustry](https://github.com/Anuken/Mindustry) mod +developed by [stabu](https://github.com/stabu-dev) and [uujuju](https://github.com/uujuju1). +Mod aimed at expanding a campaign by adding a new star system. ## Building from Source @@ -45,13 +47,9 @@ The built mod will be in the `build/libs` directory. To test the mod directly: ```bash -gradlew run -``` - -To install the mod to your Mindustry mods folder: -```bash -gradlew installJar +gradlew runClient ``` +This Mindustry client uses the `run` directory to store its data. ## Contributing @@ -62,12 +60,18 @@ gradlew installJar ### Feature Suggestions - Join our [Discord server](https://discord.gg/bNMT82Hswb) to suggest new content +- Provide examples and specific arguments why your suggestion should be added to Omaloon - The Issues section is reserved for bug reports only -### Balance Feedback -- Share your thoughts on content balancing in our Discord +### Game-play Feedback +- Share your thoughts on game-play and balancing in our Discord - Provide specific examples and reasoning for balance changes +### Pull Requests +- Improve Omaloon's code/sprites/localization and propose these changes to us by creating a [Pull Request](https://github.com/stabu-dev/Omaloon/pulls). +- Make sure your code works properly and doesn't cause any issues. +- Provide specific reasoning why your Pull Request should be accepted. + ## Credits ### Developers diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 98322657..00000000 --- a/build.gradle +++ /dev/null @@ -1,223 +0,0 @@ -import arc.files.* -import arc.util.* - -import java.util.regex.* - -buildscript{ - dependencies{ - classpath "com.github.Anuken.Arc:arc-core:$arcVersion" - } - - repositories{ - mavenCentral() - maven{url 'https://oss.sonatype.org/content/repositories/snapshots/'} - maven{url 'https://oss.sonatype.org/content/repositories/releases/'} - maven{url 'https://raw.githubusercontent.com/Zelaux/MindustryRepo/master/repository'} - maven{url 'https://jitpack.io'} - } -} - -plugins{ - // Register `EntityAnno` plugin, but only apply on `rootProject`. - id 'java' - id 'com.github.GlennFolker.EntityAnno' version "$entVersion" apply false -} - -configure(allprojects){ - sourceSets.main.java.srcDirs = [layout.projectDirectory.dir('src')] - - ext{ - compilerVersion = JavaVersion.current().ordinal() - JavaVersion.VERSION_17.ordinal() + 17 - useJitpack = Boolean.valueOf(mindustryBE) - - arc = {String module -> - return "com.github.Anuken.Arc$module:$arcVersion" - } - arcLibrary = {String module -> - return "com.github.Zelaux.ArcLibrary$module:$arcLibraryVersion" - } - mindustry = {String module -> - return "com.github.Anuken.Mindustry$module:$mindustryVersion" - } - } - - configurations.configureEach{ - // Resolve the correct Mindustry dependency, and force Arc version. - resolutionStrategy.eachDependency{ - if(useJitpack && requested.group == 'com.github.Anuken.Mindustry'){ - useTarget "com.github.Anuken.MindustryJitpack:$it.requested.name:$mindustryBEVersion" - } - - if(requested.group == 'com.github.Anuken.Arc'){ - useVersion arcVersion - } - } - } - - dependencies{ - // Downgrade Java 9+ syntax into being available in Java 8. - annotationProcessor "com.github.GlennFolker.EntityAnno:downgrader:$entVersion" - } - - repositories{ - // Necessary Maven repositories to pull dependencies from. - mavenCentral() - maven{url 'https://oss.sonatype.org/content/repositories/snapshots/'} - maven{url 'https://oss.sonatype.org/content/repositories/releases/'} - - // Use Zelaux's non-buggy repository for release Mindustry and Arc builds. - if(!useJitpack) maven{url 'https://raw.githubusercontent.com/Zelaux/MindustryRepo/master/repository'} - maven{url 'https://raw.githubusercontent.com/Zelaux/Repo/master/repository'}//for ArcLibrary - maven{url 'https://jitpack.io'} - } - - tasks.withType(JavaCompile).configureEach{ - // Use Java 17+ syntax, but target Java 8 bytecode version. - sourceCompatibility = compilerVersion - options.release.set 8 - options.compilerArgs << '-Xlint:-options' - - options.incremental = true - options.encoding = 'UTF-8' - } -} - -configure(rootProject){ - // Apply `EntityAnno` plugin to integrate the annotation processors. - apply plugin: 'com.github.GlennFolker.EntityAnno' - - entityAnno{ - modName = property('modName') - mindustryVersion = property(useJitpack ? 'mindustryBEVersion' : 'mindustryVersion') - isJitpack = useJitpack - revisionDir = layout.projectDirectory.dir('revisions').asFile - fetchPackage = modFetch - genSrcPackage = modGenSrc - genPackage = modGen - } - - dependencies{ - // Use the entity generation annotation processor. - compileOnly "com.github.GlennFolker.EntityAnno:entity:$entVersion" - kapt "com.github.GlennFolker.EntityAnno:entity:$entVersion" - - compileOnly "org.jetbrains:annotations:24.0.1" - - // Depend on Mindustry/Arc classpath. - compileOnly "${mindustry(':core')}" - compileOnly "${arc(':arc-core')}" - implementation "${arcLibrary(':graphics-draw3d')}" - implementation "${arcLibrary(':graphics-dashDraw')}" - implementation "${arcLibrary(':graphics-extendedDraw')}" - } - - jar{ - archiveFileName = "${modArtifact}Desktop.jar" - - from files(sourceSets.main.output.classesDirs) - from files(sourceSets.main.output.resourcesDir) - from configurations.runtimeClasspath.collect{it.isDirectory() ? it : zipTree(it)} - - from files(layout.projectDirectory.dir('assets')) - from(layout.projectDirectory){ - include 'mod.json' - include 'icon.png' - } - - doFirst{ - def name = Pattern - .compile('"name": "(.*)"') - .matcher(layout.projectDirectory.file('mod.json').asFile.text) - - if(name.find() && name.group(1) != modName){ - logger.log(LogLevel.WARN, "Mod name mismatch: '${name.group(1)}' (mod.json) != '$modName' (gradle.properties)") - } - } - } - - tasks.register('dex', Jar){ - inputs.files tasks.jar - archiveFileName = "${modArtifact}.jar" - - final def desktopJar = tasks.jar.archiveFile - final def dexJar = file("$temporaryDir/Dexed.jar") - - from zipTree(desktopJar), zipTree(dexJar) - doFirst{ - // Find Android SDK root. - def sdkRoot = file( - System.getenv('ANDROID_SDK_ROOT') ?: System.getenv('ANDROID_HOME') ?: - { throw new GradleException('Neither `ANDROID_SDK_ROOT` nor `ANDROID_HOME` is set') } - ) - - // Find `d8`. - def d8 = file("$sdkRoot/build-tools/$androidBuildVersion/d8") - if(!d8.exists()){ - throw new GradleException("Android SDK `build-tools;$androidBuildVersion` isn't installed or is corrupted") - } - - // Initialize a release build. - def input = desktopJar.get().asFile - def command = "$d8 --release --min-api $androidMinVersion --output $dexJar $input" - - // Include all compile and runtime classpath. - (configurations.compileClasspath.asList() + configurations.runtimeClasspath.asList()).forEach{ - if(it.exists()) command = "$command --classpath $it" - } - - // Include Android platform as library. - def androidJar = file("$sdkRoot/platforms/android-$androidSdkVersion/android.jar") - if(!androidJar.exists()){ - throw new GradleException("Android SDK `platforms;android-$androidSdkVersion` isn't installed or is corrupted") - } - - command = "$command --lib $androidJar" - if(OS.isWindows) command = "cmd /c $command" - - // Run `d8`. - logger.log(LogLevel.LIFECYCLE, 'Running `d8`.') - command.execute(null, layout.projectDirectory.asFile).waitForProcessOutput(System.out, System.err) - } - } -} - -tasks.register('installJar'){ - dependsOn tasks.jar - doLast{ - def folder = Fi.get(OS.getAppDataDirectoryString('Mindustry')).child('mods') - folder.mkdirs() - - folder.child(tasks.jar.archiveFileName.get()).delete() - folder.child(tasks.dex.archiveFileName.get()).delete() - - def jarOutput = new Fi(tasks.jar.archiveFile.get().asFile) - def dexOutput = new Fi(tasks.dex.archiveFile.get().asFile) - - if(!jarOutput.exists() && !dexOutput.exists()){ - logger.log(LogLevel.ERROR, 'Neither :jar nor :dex artifacts are found; run one of these tasks first.') - }else if(dexOutput.exists()){ - dexOutput.copyTo(folder) - logger.log(LogLevel.LIFECYCLE, "Copied :dex output to $folder.") - }else{ - jarOutput.copyTo(folder) - logger.log(LogLevel.LIFECYCLE, "Copied :jar output to $folder.") - } - } -} - -tasks.register('run'){ - dependsOn installJar - doLast{ - def gamePath = "${temporaryDir.absolutePath}\\Mindustry${mindustryVersion}.jar" - def gameUrl = mindustryVersion.startsWith("v") ? - "https://github.com/Anuken/Mindustry/releases/download/${mindustryVersion}/Mindustry.jar" : - "https://github.com/Anuken/MindustryBuilds/releases/download/${mindustryVersion}/Mindustry-BE-Desktop-${mindustryVersion}.jar" - def gameFile = new File(gamePath) - if (!gameFile.exists()) { - println "Downloading Mindustry ${mindustryVersion} from ${gameUrl} to ${gamePath}" - new URL(gameUrl).withInputStream{ i -> gameFile.withOutputStream{ it << i } } - println "Done" - } - javaexec{ classpath = files(gamePath) } - } -} \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 00000000..5c7dc768 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,237 @@ +import arc.util.* +import arc.util.serialization.* +import de.undercouch.gradle.tasks.download.Download +import ent.* +import java.io.* + +buildscript{ + val arcVersion: String by project + val useJitpack = property("mindustryBE").toString().toBooleanStrict() + + dependencies{ + classpath("com.github.Anuken.Arc:arc-core:$arcVersion") + } + + repositories{ + if(!useJitpack) maven("https://raw.githubusercontent.com/Zelaux/MindustryRepo/master/repository") + maven("https://jitpack.io") + } +} + +plugins{ + java + id("de.undercouch.download") version "5.4.0" + id("com.github.GlennFolker.EntityAnno") apply false +} + +val arcVersion: String by project +val arcLibraryVersion: String by project +val mindustryVersion: String by project +val mindustryBEVersion: String by project +val entVersion: String by project + +val modName: String by project +val modArtifact: String by project +val modFetch: String by project +val modGenSrc: String by project +val modGen: String by project + +val androidSdkVersion: String by project +val androidBuildVersion: String by project +val androidMinVersion: String by project + +val useJitpack = property("mindustryBE").toString().toBooleanStrict() + +fun arc(module: String): String{ + return "com.github.Anuken.Arc$module:$arcVersion" +} + +fun arcLibrary(module: String):String{ + return "com.github.Zelaux.ArcLibrary$module:$arcLibraryVersion" +} + +fun mindustry(module: String): String{ + return "com.github.Anuken.Mindustry$module:$mindustryVersion" +} + +fun entity(module: String): String{ + return "com.github.GlennFolker.EntityAnno$module:$entVersion" +} + +allprojects{ + apply(plugin = "java") + sourceSets["main"].java.setSrcDirs(listOf(layout.projectDirectory.dir("src"))) + + configurations.configureEach{ + // Resolve the correct Mindustry dependency, and force Arc version. + resolutionStrategy.eachDependency{ + if(useJitpack && requested.group == "com.github.Anuken.Mindustry"){ + useTarget("com.github.Anuken.MindustryJitpack:${requested.module.name}:$mindustryBEVersion") + }else if(requested.group == "com.github.Anuken.Arc"){ + useVersion(arcVersion) + } + } + } + + dependencies{ + // Downgrade Java 9+ syntax into being available in Java 8. + annotationProcessor(entity(":downgrader")) + } + + repositories{ + // Necessary Maven repositories to pull dependencies from. + mavenCentral() + maven("https://oss.sonatype.org/content/repositories/snapshots/") + maven("https://oss.sonatype.org/content/repositories/releases/") + maven("https://raw.githubusercontent.com/GlennFolker/EntityAnnoMaven/main") + + // Use Zelaux's non-buggy repository for release Mindustry and Arc builds. + if(!useJitpack) maven("https://raw.githubusercontent.com/Zelaux/MindustryRepo/master/repository") + maven("https://raw.githubusercontent.com/Zelaux/Repo/master/repository")//for ArcLibrary + maven("https://jitpack.io") + } + + tasks.withType().configureEach{ + // Use Java 17+ syntax, but target Java 8 bytecode version. + sourceCompatibility = "17" + options.apply{ + release = 8 + compilerArgs.add("-Xlint:-options") + + isIncremental = true + encoding = "UTF-8" + } + } +} + +project(":"){ + apply(plugin = "com.github.GlennFolker.EntityAnno") + configure{ + modName = project.properties["modName"].toString() + mindustryVersion = project.properties[if(useJitpack) "mindustryBEVersion" else "mindustryVersion"].toString() + isJitpack = useJitpack + revisionDir = layout.projectDirectory.dir("revisions").asFile + fetchPackage = modFetch + genSrcPackage = modGenSrc + genPackage = modGen + } + + dependencies{ + // Use the entity generation annotation processor. + compileOnly(entity(":entity")) + add("kapt", entity(":entity")) + + compileOnly("org.jetbrains:annotations:24.0.1") + + compileOnly(mindustry(":core")) + compileOnly(arc(":arc-core")) + implementation(arcLibrary(":graphics-draw3d")) + implementation(arcLibrary(":graphics-dashDraw")) + implementation(arcLibrary(":graphics-extendedDraw")) + } + + val jar = tasks.named("jar"){ + archiveFileName = "${modArtifact}Desktop.jar" + + val meta = layout.projectDirectory.file("$temporaryDir/mod.json") + from( + files(sourceSets["main"].output.classesDirs), + files(sourceSets["main"].output.resourcesDir), + configurations.runtimeClasspath.map{conf -> conf.map{if(it.isDirectory) it else zipTree(it)}}, + + files(layout.projectDirectory.dir("assets")), + layout.projectDirectory.file("icon.png"), + meta + ) + + metaInf.from(layout.projectDirectory.file("LICENSE")) + doFirst{ + // Deliberately check if the mod meta is actually written in HJSON, since, well, some people actually use + // it. But this is also not mentioned in the `README.md`, for the mischievous reason of driving beginners + // into using JSON instead. + val metaJson = layout.projectDirectory.file("mod.json") + val metaHjson = layout.projectDirectory.file("mod.hjson") + + if(metaJson.asFile.exists() && metaHjson.asFile.exists()){ + throw IllegalStateException("Ambiguous mod meta: both `mod.json` and `mod.hjson` exist.") + }else if(!metaJson.asFile.exists() && !metaHjson.asFile.exists()){ + throw IllegalStateException("Missing mod meta: neither `mod.json` nor `mod.hjson` exist.") + } + + val isJson = metaJson.asFile.exists() + val map = (if(isJson) metaJson else metaHjson).asFile + .reader(Charsets.UTF_8) + .use{Jval.read(it)} + + map.put("name", modName) + meta.asFile.writer(Charsets.UTF_8).use{file -> BufferedWriter(file).use{map.writeTo(it, Jval.Jformat.formatted)}} + } + } + + tasks.register("dex"){ + inputs.files(jar) + archiveFileName = "$modArtifact.jar" + + val desktopJar = jar.flatMap{it.archiveFile} + val dexJar = File(temporaryDir, "Dex.jar") + + from(zipTree(desktopJar), zipTree(dexJar)) + doFirst{ + logger.lifecycle("Running `d8`.") + providers.exec{ + // Find Android SDK root. + val sdkRoot = File( + OS.env("ANDROID_SDK_ROOT") ?: OS.env("ANDROID_HOME") ?: + throw IllegalStateException("Neither `ANDROID_SDK_ROOT` nor `ANDROID_HOME` is set.") + ) + + // Find `d8`. + val d8 = File(sdkRoot, "build-tools/$androidBuildVersion/${if(OS.isWindows) "d8.bat" else "d8"}") + if(!d8.exists()) throw IllegalStateException("Android SDK `build-tools;$androidBuildVersion` isn't installed or is corrupted") + + // Initialize a release build. + val input = desktopJar.get().asFile + val command = arrayListOf("$d8", "--release", "--min-api", androidMinVersion, "--output", "$dexJar", "$input") + + // Include all compile and runtime classpath. + (configurations.compileClasspath.get().toList() + configurations.runtimeClasspath.get().toList()).forEach{ + if(it.exists()) command.addAll(arrayOf("--classpath", it.path)) + } + + // Include Android platform as library. + val androidJar = File(sdkRoot, "platforms/android-$androidSdkVersion/android.jar") + if(!androidJar.exists()) throw IllegalStateException("Android SDK `platforms;android-$androidSdkVersion` isn't installed or is corrupted") + + command.addAll(arrayOf("--lib", "$androidJar")) + if(OS.isWindows) command.addAll(0, arrayOf("cmd", "/c").toList()) + + // Run `d8`. + commandLine(command) + }.result.get().rethrowFailure() + } + } + + tasks.register("fetchClient") { + src("https://github.com/Anuken/Mindustry/releases/download/$mindustryVersion/Mindustry.jar") + dest(file("$rootDir/run/Mindustry.jar")) + overwrite(false) + } + + tasks.register("runClient") { + dependsOn("fetchClient") + dependsOn("jar") + + val modFilename = "${project.name}Desktop.jar" + doFirst { + copy { + from("$rootDir/build/libs/$modFilename") + into("$rootDir/run/mods") + rename { modFilename } + } + } + + environment("MINDUSTRY_DATA_DIR", "$rootDir/run") + classpath(files("$rootDir/run/Mindustry.jar")) + mainClass.set("mindustry.desktop.DesktopLauncher") + } +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 7c240f48..8e93fe38 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,7 +13,7 @@ modArtifact = Omaloon # EntityAnno version, for integrating syntax-downgrader and entity annotation processor. # The exact version you need should be looked up on the project's `README.md` # (see https://github.com/GlennFolker/EntityAnno?tab=readme-ov-file#version-compatibility). -entVersion = v146.0.8 +entVersion = v146.0.10 # Set to `true` if the mod is compiled against Mindustry bleeding-edge build. # See documents on `mindustryVersion` and `mindustryBEVersion`. mindustryBE = false @@ -23,16 +23,16 @@ mindustryVersion = v146 # Mindustry *bleeding-edge* version, corresponds to commit hashes of Anuken/MindustryJitpack, e.g. `345ea0d54de0aee6953a664468556f4fea1a7c4f`. # Leave empty if `mindustryBE = false`. mindustryBEVersion = -# Arc version, should either follow `mindustryVersion` for release or whatever hash bleeding-edge Mindustry uses. +# Arc version should either follow `mindustryVersion` for release or whatever hash bleeding-edge Mindustry uses. arcVersion = v146 # Arc library version, has some things that omaloon needs -arcLibraryVersion = v1.0.5.1 +arcLibraryVersion = v1.0.7 ##### Android SDK configuration for building Android artifacts. # Android platform SDK version. -androidSdkVersion = 34 +androidSdkVersion = 35 # Android build-tools version. -androidBuildVersion = 34.0.0 +androidBuildVersion = 35.0.0 # Android platform minimum API version. Should be left as 14, as that's what Mindustry officially supports. androidMinVersion = 14 diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index d556a4a1..00000000 --- a/settings.gradle +++ /dev/null @@ -1,13 +0,0 @@ -pluginManagement{ - repositories{ - gradlePluginPortal() - maven{url 'https://jitpack.io'} - } -} - -if(JavaVersion.current().ordinal() < JavaVersion.VERSION_17.ordinal()){ - throw new GradleException("JDK 17 is a required minimum version. Yours: ${System.getProperty('java.version')}") -} - -rootProject.name = 'Omaloon' - diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 00000000..b1b496b3 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,18 @@ +pluginManagement{ + repositories{ + gradlePluginPortal() + maven("https://raw.githubusercontent.com/GlennFolker/EntityAnnoMaven/main") + } + + plugins{ + val entVersion: String by settings + id("com.github.GlennFolker.EntityAnno") version(entVersion) + } +} + +if(JavaVersion.current().ordinal < JavaVersion.VERSION_17.ordinal){ + throw IllegalStateException("JDK 17 is a required minimum version. Yours: ${System.getProperty("java.version")}") +} + +val modName: String by settings +rootProject.name = modName \ No newline at end of file diff --git a/src/omaloon/utils/OlUtils.java b/src/omaloon/utils/OlUtils.java index 6d26bc9e..bec2ea64 100644 --- a/src/omaloon/utils/OlUtils.java +++ b/src/omaloon/utils/OlUtils.java @@ -3,8 +3,8 @@ import arc.func.*; import arc.graphics.g2d.*; import arc.struct.*; -import mindustry.type.Item; -import omaloon.ui.MultiItemData; +import mindustry.type.*; +import omaloon.ui.*; import org.jetbrains.annotations.*; import static arc.Core.*; From 923b0071281944e1420f2bb4d784e1f7dca36d60 Mon Sep 17 00:00:00 2001 From: = Date: Tue, 7 Jan 2025 20:24:09 -0300 Subject: [PATCH 24/54] include an install task in the gradle --- build.gradle.kts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/build.gradle.kts b/build.gradle.kts index 5c7dc768..82e9ec2b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,3 +1,4 @@ +import arc.files.Fi import arc.util.* import arc.util.serialization.* import de.undercouch.gradle.tasks.download.Download @@ -234,4 +235,17 @@ project(":"){ classpath(files("$rootDir/run/Mindustry.jar")) mainClass.set("mindustry.desktop.DesktopLauncher") } + + tasks.register("install"){ + dependsOn("jar") + doLast{ + val folder = Fi.get(OS.getAppDataDirectoryString("Mindustry")).child("mods") + folder.mkdirs() + + val input = Fi.get("$rootDir/build/libs/${project.name}Desktop.jar") + folder.child(input.name()).delete() + input.copyTo(folder) + logger.lifecycle("Copied :jar output to $folder.") + } + } } \ No newline at end of file From 26629b9817e04c9781c3d86ae63e3294f6834ade Mon Sep 17 00:00:00 2001 From: = Date: Tue, 7 Jan 2025 20:59:06 -0300 Subject: [PATCH 25/54] set up density --- assets/bundles/bundle.properties | 7 ++++--- src/omaloon/content/OlLiquids.java | 19 +++++++++++++++++++ src/omaloon/world/meta/OlStats.java | 4 ++++ 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/assets/bundles/bundle.properties b/assets/bundles/bundle.properties index ce4c5779..0e1c0b82 100644 --- a/assets/bundles/bundle.properties +++ b/assets/bundles/bundle.properties @@ -327,11 +327,11 @@ block.omaloon-impulse-node.description = Transmits power to connected buildings. block.omaloon-hammer-drill.name = Hammer drill block.omaloon-hammer-drill.description = When placed on ore, outputs items. Efficiency increases with decreasing pressure inside, reaching peak performance in near vacuum conditions. -block.omaloon-air-well.name = Air Well -block.omaloon-air-well.description = Constantly pulls air in or out. - ## stats category.omaloon-pressure = Pressure + +stat.omaloon-density = Density + stat.omaloon-consumepressure = Consume Pressure stat.omaloon-minpressure = Min Pressure stat.omaloon-maxpressure = Max Pressure @@ -345,6 +345,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-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 a11b84ae..e8249f54 100644 --- a/src/omaloon/content/OlLiquids.java +++ b/src/omaloon/content/OlLiquids.java @@ -1,8 +1,11 @@ package omaloon.content; +import arc.struct.*; +import arc.util.*; import mindustry.content.*; import mindustry.type.*; import omaloon.type.liquid.*; +import omaloon.world.meta.*; import static arc.graphics.Color.*; @@ -12,6 +15,8 @@ public class OlLiquids { end; + public static ObjectFloatMap densities = new ObjectFloatMap<>(); + public static void load(){ glacium = new CrystalLiquid("glacium", valueOf("5e929d")){{ effect = OlStatusEffects.glacied; @@ -36,6 +41,20 @@ public static void load(){ canStayOn.add(Liquids.water); }}; + addDensity(Liquids.water, 1000); + addDensity(Liquids.slag, 1600); + addDensity(Liquids.oil, 700); + addDensity(Liquids.cryofluid, 200); + addDensity(glacium, 1300); + addDensity(tiredGlacium, 1300); } + public static void addDensity(Liquid liquid, float density) { + densities.put(liquid, density); + liquid.stats.add(OlStats.density, density, OlStats.liquidPerWorldUnit); + } + + public static float getDensity(@Nullable Liquid liquid) { + return densities.get(liquid, 1.2f); + } } diff --git a/src/omaloon/world/meta/OlStats.java b/src/omaloon/world/meta/OlStats.java index e98a6c50..4202ff3a 100644 --- a/src/omaloon/world/meta/OlStats.java +++ b/src/omaloon/world/meta/OlStats.java @@ -21,6 +21,8 @@ public class OlStats { addFluid = new Stat("omaloon-add-fluid", StatCat.crafting), removeFluid = new Stat("omaloon-remove-fluid", StatCat.crafting), + density = new Stat("omaloon-density"), + pressureFlow = new Stat("omaloon-pressureflow", pressure), maxPressure = new Stat("omaloon-maxPressure", pressure), @@ -31,6 +33,8 @@ public class OlStats { outputPressure = new Stat("omaloon-outputPressure", pressure); public static final StatUnit + liquidPerWorldUnit = new StatUnit("omaloon-liquidPerWorldUnit"), + pressureUnits = new StatUnit("omaloon-pressureUnits", "\uC357"), pressureSecond = new StatUnit("omaloon-pressureSecond", "\uC357"); From 3dfa9181e50f0afe3cfeb35e207bd6d0f98c2843 Mon Sep 17 00:00:00 2001 From: = Date: Tue, 7 Jan 2025 21:09:15 -0300 Subject: [PATCH 26/54] uncomplicate --- src/omaloon/math/OlMath.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/omaloon/math/OlMath.java b/src/omaloon/math/OlMath.java index ae7b5076..ddf71d67 100644 --- a/src/omaloon/math/OlMath.java +++ b/src/omaloon/math/OlMath.java @@ -13,9 +13,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 area, float pressureStart, float pressureEnd, float density, float time) { - float diff = -2f * (pressureEnd - pressureStart); - if (diff == 0) return 0f; - return (area * (diff/Math.abs(diff)) * Mathf.sqrt(Math.abs(diff) / density) * time * density)/(60f); + public static float bernoulliFlowRate(float opening, float pressureStart, float pressureEnd, float density) { + return opening * (pressureEnd - pressureStart) / density; } + // TODO rename } From 5e7cf717ab4f2ccaca6d50ae505e11abb83c45ca Mon Sep 17 00:00:00 2001 From: = Date: Tue, 7 Jan 2025 21:30:29 -0300 Subject: [PATCH 27/54] a --- src/omaloon/math/OlMath.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/omaloon/math/OlMath.java b/src/omaloon/math/OlMath.java index ddf71d67..80d8c614 100644 --- a/src/omaloon/math/OlMath.java +++ b/src/omaloon/math/OlMath.java @@ -13,7 +13,7 @@ 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) { + public static float bernoulliFlowRate(float opening, float pressureStart, float pressureEnd, float density, float time) { return opening * (pressureEnd - pressureStart) / density; } // TODO rename From e8ee6cc78e4b3adcfa38bb2beb2a4ea4e6ed3a54 Mon Sep 17 00:00:00 2001 From: = Date: Fri, 10 Jan 2025 22:53:51 -0300 Subject: [PATCH 28/54] 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; } From 4a8e7b64213116e47113514d0270e37a591248dd Mon Sep 17 00:00:00 2001 From: = Date: Sun, 12 Jan 2025 01:10:07 -0300 Subject: [PATCH 29/54] 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))); } } } From 2e3e544fd020a9e714bfd53d7f729bc0f48f8b4e Mon Sep 17 00:00:00 2001 From: = Date: Sun, 12 Jan 2025 10:36:44 -0300 Subject: [PATCH 30/54] half working pump thingy --- src/omaloon/content/blocks/OlDistributionBlocks.java | 1 - .../world/blocks/liquid/PressureLiquidPump.java | 10 +++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/omaloon/content/blocks/OlDistributionBlocks.java b/src/omaloon/content/blocks/OlDistributionBlocks.java index 337b6ab9..a357d124 100644 --- a/src/omaloon/content/blocks/OlDistributionBlocks.java +++ b/src/omaloon/content/blocks/OlDistributionBlocks.java @@ -130,7 +130,6 @@ public static void load() { OlItems.cobalt, 20 ); pumpStrength = 0.1f; - pressureDifference = 20f; }}; liquidValve = new PressureLiquidValve("liquid-valve") {{ diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidPump.java b/src/omaloon/world/blocks/liquid/PressureLiquidPump.java index 51d9103a..215aaa7f 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidPump.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidPump.java @@ -202,6 +202,14 @@ public void draw() { if (tiling == 0) Draw.rect(topRegion, x, y, rotdeg()); } + public float pumpEfficiency() { + float a = 0; + for(int i = 1; i <= chainSize(); i++) { + a += pressureDifference/i; + } + return a; + } + /** * Returns the building at the start of the pump chain. */ @@ -272,7 +280,7 @@ public void updateTile() { 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); + float flow = pumpStrength/chainSize() * ((backPressure + pumpEfficiency()) - frontPressure) / OlLiquids.getViscosity(pumpLiquid); if (pumpLiquid != null && front != null && back != null) { flow = Mathf.clamp(flow, -front.pressure().get(pumpLiquid), back.pressure().get(pumpLiquid)); From 707ce5d6fcd3db42bbd1643ee88b8b2a256f04c3 Mon Sep 17 00:00:00 2001 From: = Date: Sun, 12 Jan 2025 10:39:07 -0300 Subject: [PATCH 31/54] atleast this works with air --- src/omaloon/world/interfaces/HasPressure.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/omaloon/world/interfaces/HasPressure.java b/src/omaloon/world/interfaces/HasPressure.java index 16edafff..7538c734 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); From 3e59effc40442e76815f48adecc98d5cd8728baf Mon Sep 17 00:00:00 2001 From: = Date: Sun, 12 Jan 2025 20:56:44 -0300 Subject: [PATCH 32/54] stats --- assets/bundles/bundle.properties | 37 +++++++++++------- .../blocks/liquids/liquid-gauge-pointer.png | Bin 162 -> 211 bytes .../blocks/liquids/liquid-gauge-tiles.png | Bin 1015 -> 729 bytes .../sprites/blocks/liquids/liquid-gauge.png | Bin 428 -> 508 bytes src/omaloon/content/OlLiquids.java | 4 +- .../blocks/liquid/PressureLiquidPump.java | 5 ++- src/omaloon/world/consumers/ConsumeFluid.java | 2 +- src/omaloon/world/meta/OlStats.java | 19 +++++---- src/omaloon/world/meta/PressureConfig.java | 6 ++- 9 files changed, 45 insertions(+), 28 deletions(-) diff --git a/assets/bundles/bundle.properties b/assets/bundles/bundle.properties index f5a91bdd..9e3c6209 100644 --- a/assets/bundles/bundle.properties +++ b/assets/bundles/bundle.properties @@ -330,30 +330,39 @@ block.omaloon-hammer-drill.description = When placed on ore, outputs items. Effi ## stats category.omaloon-pressure = Pressure -stat.omaloon-density = Density -stat.omaloon-viscosity.format = @%, @ Todo - -stat.omaloon-consumepressure = Consume Pressure -stat.omaloon-minpressure = Min Pressure -stat.omaloon-maxpressure = Max Pressure stat.omaloon-max-speed = Max Speed stat.omaloon-min-speed = Min Speed -stat.omaloon-outputpressure = Output Pressure + +stat.omaloon-add-fluid = Add Fluid +air = Air +stat.omaloon-remove-fluid = Remove Fluid + +stat.omaloon-density = Density + +stat.omaloon-pump-strength = Pump Strength +stat.omaloon-pressure-gradient = Pressure Gradient + +stat.omaloon-min-pressure = Min Pressure +stat.omaloon-max-pressure = Max Pressure + stat.omaloon-pressureflow = Speed -stat.omaloon-pressurerange = Operating Range -stat.omaloon-pressurerange.format = from \uC357 @ pressure units to \uC357 @ pressure units. +stat.omaloon-pressure-range = Operating Range +stat.omaloon-pressure-range.format = between \uC357 @ Pascals and \uC357 @ Pascals. stat.omaloon-optimal-pressure = Optimal Pressure -stat.omaloon-optimal-pressure.format = \uC357 @ pressure units (@%) +stat.omaloon-optimal-pressure.format = \uC357 @ Pascals (@%) ## ui units -unit.omaloon-liquidperworldunit = Liquid per World cube -unit.omaloon-pressuresecond = pressure units / second -unit.omaloon-pressureunits = pressure units +unit.omaloon-density-unit = Pascals/Fluid Capacity +unit.omaloon-viscosity-unit = Pascal Seconds + +unit.omaloon-pressure-unit = Pascals +unit.omaloon-pressure-second = Pascals/Second + + bar.air = Air: bar.pressure = Pressure: bar.pressure-liquid = ({0}: {1} / Air: {2}) bar.hail-shield-health = Individual Shelter -omaloon-source-negative = Negative ## abilities ability.hailshield = Individual Shelter diff --git a/assets/sprites/blocks/liquids/liquid-gauge-pointer.png b/assets/sprites/blocks/liquids/liquid-gauge-pointer.png index bc46dd8c11f49f5a29d781c8fb8e81c1562e6429..b8df1cbfab802b4dbcce9b423e55c6f28e73cd46 100644 GIT binary patch delta 162 zcmZ3)c$sm6Wqqrsi(^PcYjT1F>*55Fo~A&90}T^ndiVXy{6F#MZ1ZzUr*$@&ER6Q+ zRQ9;maJq;M2(pchMfNS)qr?mZ&J{hze$_KFQZ0=lcBbh2)v8!F$eiZ1Y|`Rez!Gqj z(cOQp(h9b4D}|GcKY}dn+#h(iIO|J4Dq`8mdQk&tr8LM+Ms|kvx77qLu;`s<00K`} KKbLh*2~7a#GCH0B delta 112 zcmV-$0FVFE0ipqrIcZc$L_t(oh3(Wq4ge4gL{WABJJ*_!#t@Cef$xIz| zckdRNNxP(>G5n;&_P{D!EwObt3J=33PG|sNY?;^uN)3K Sr3M%P0000@kd7vLXu)1+@3I&EN2YWr@hk1ybpI&5fd*7azkMsam)p#W%E5IMW4-c;9Jia8-D7>3lbv zzh7oUa>KJfsfo{DD^~B_uQ@?PpGkMxE#}h#fn5*(85#95Y6jfi_GojSqB-{ire#NV za%fvJ@a$+^w&k0(?LLiV&dSes9I12=TDZ1=vC>v^?TVu!1?E#uEH%4Tw2zTtWxY5< zbmPH;K^N}yo}ZnWxvVpS_1&@O|GhWgQtH^Fyr8XP${f*v-CkuM*&`U`o&+<-{bLAN z(Q`=tfxtfo#XpSNhvYSm7Oe*g6!<&-VE*e1Bs77tOl|fGK9bow;T{F(iBtt)A)h?kUU4d!XL)(A}#h8?gNPlN`Dyj z5`HiX-J5H_ps(@EvC2PCluf0^Ur&vO2)mA=LlJ!e_O z*ME##*)K(&4VqP)>wPr;2lGSz9r`D6nXM*tNdClavG4p9Kbc$p`5oQ*fs4Ji(C|%0 Ryek6`c)I$ztaD0e0s!jYKcD~r delta 973 zcmV;;12X*C1@{M#IDZ4FNklWI<4CEg6AAvvNCS~g2svu43`^f?K2IERM zMk>Sgm1**cg!Y=#G^C`Z5rjYhdo5|kv?Nj^W}w6l`+pzlvzGS!@-XoCS8sZQ zOC&BY)&fsS3=!a*#2|t1Uk_r3m#1fFU`ziW79ee4FSts;OMk-SIq@eTBAU*V+Uf26 zU3`AO-Ku>ycN_7!=m8IS=`(H21pzO(mxMY8Jm8+T;v7hsN&}|9H_}F$2cidfLu6p> z8SiVFgmVWJyhK6+&k{fZJZ;tuGJ=Ny0^e{09^srwhIEDkczgE#uh!` zCE*F>W3GcWE%T&t;W=S=Ry+_9<>En4I~{k!E0Jz$yxo4ZZX3rNJ|bELaIP+A3D^#NobSo{RiQk%}x0-)q-1Y9JbnMA@0E`7P? z`hW#oB!5st!U|4Q*od@_8bLH8f|j8MRGSf*MJnE*HY1Yyhw1|t0+A#_^Z}JX1PSPD z*wWJafz|VY^b3b1B%DN8Ml_S?Qa@nP6U4Kj76XtNZ`Bj72p~5cITBVqfrx1M^ZT#5 z3^f;e!mjJ;)&fq{sD8i;?j0p{mIAD z4mR8V^g8OIa(Y z1E^Zgt*JiHq<+8)?j-^5gcf~(sIqIXa|y!8X!^Z|717DmId^>P{ohw2BkhPi>g;3@$xiR$`+T796p vexOz#Xi`5=s}Gp#2O{+Wq8o?>-vmAZ^9k&M>)UQX00000NkvXXu0mjf84|}4 diff --git a/assets/sprites/blocks/liquids/liquid-gauge.png b/assets/sprites/blocks/liquids/liquid-gauge.png index 46865391aec4e27f2191df4133d6354043b4a5c5..79359a548b55c5905bebd5533c7d10328612d121 100644 GIT binary patch delta 461 zcmV;;0W$uq1N;M!Ie)H6L_t(oh0T{ePQySDh2J8VNE`v>5^3n5=BI)JIwUA^03>=M za)2!okq!!|@>4@clS^2+1szly*2}!v*(kAimF?K`J@5QD>yYU6`TaY+wn<%F9l7|t zak6c=WMXyD7CbfKa`1Xt0{}i3iz2{5w+jI1>~~ZX&H@jznturJAkD;%6)pv~z*(%I z$_fvfO@;sf?|tKXuh#YO78bER1vv$w6VLEWEaLr7Sfo&^mARRK2EFUSB0(X3RBh~Bz0NX1RH=Y0amj->q5OCIbAAfi_IUZ~*uLGN8se-p30?00000NkvXXu0mjf DZ^zS( delta 380 zcmV-?0fYYh1FQp(Ie%VBL_t(og~eApb^fT~g=M1PZ9hnL-T(qzR#h zj%F{hkCTK7;qjZ@kc8_4 z+$Z4}`0{g29cFJ6Rp1=|yBr`XuoYY+U?pM69Q_3V(3~34>3>+)R6nXJ(Pwx+q Date: Sun, 12 Jan 2025 22:22:28 -0300 Subject: [PATCH 33/54] pump effects --- src/omaloon/content/OlFx.java | 30 +++++++++++++++++-- src/omaloon/content/OlLiquids.java | 2 +- .../content/blocks/OlDistributionBlocks.java | 8 +++-- .../blocks/liquid/PressureLiquidPump.java | 18 +++++++++++ .../blocks/liquid/PressureLiquidValve.java | 4 +-- 5 files changed, 55 insertions(+), 7 deletions(-) diff --git a/src/omaloon/content/OlFx.java b/src/omaloon/content/OlFx.java index a172d62a..498945d4 100644 --- a/src/omaloon/content/OlFx.java +++ b/src/omaloon/content/OlFx.java @@ -182,7 +182,7 @@ public class OlFx { Draw.blend(); }), - pumpOut = new Effect(60f, e -> { + flowOut = new Effect(60f, e -> { Draw.color(e.color); Draw.alpha(e.fout() / 5); vec.trns(e.rotation, 4f).add(e.x, e.y); @@ -202,7 +202,7 @@ public class OlFx { Fill.rect(vec.x + x, vec.y + y, 5 * e.fin(), e.fin(), vec.angleTo(vec.x + x, vec.y + y)); }); }), - pumpIn = new Effect(60f, e -> { + flowIn = new Effect(60f, e -> { Draw.color(e.color); Draw.alpha(e.fin() / 5); vec.trns(e.rotation, 4f).add(e.x, e.y); @@ -223,6 +223,32 @@ public class OlFx { }); }), + pumpOut = new Effect(60f, e -> { + Draw.color(e.color); + Draw.alpha(e.fout() / 5); + vec.trns(e.rotation, 4f).add(e.x, e.y); + Angles.randLenVectors(e.id, 3, 16 * e.fin(), e.rotation, 10, (x, y) -> { + Fill.circle(vec.x + x, vec.y + y, 3 * e.fin()); + }); + Draw.alpha(e.fout() / 7); + vec.trns(e.rotation, 4f).add(e.x, e.y); + Angles.randLenVectors(e.id + 3, 3, 16 * e.fin(), e.rotation, 20, (x, y) -> { + Fill.rect(vec.x + x, vec.y + y, 5 * e.fin(), e.fin(), vec.angleTo(vec.x + x, vec.y + y)); + }); + }), + pumpIn = new Effect(60f, e -> { + Draw.color(e.color); + Draw.alpha(e.fin() / 5); + vec.trns(e.rotation, 4f).add(e.x, e.y); + Angles.randLenVectors(e.id, 3, 16 * e.fout(), e.rotation, 10, (x, y) -> { + Fill.circle(vec.x + x, vec.y + y, 3 * e.fout()); + }); + Draw.alpha(e.fin() / 7); + Angles.randLenVectors(e.id + 3, 3, 16 * e.fout(), e.rotation, 20, (x, y) -> { + Fill.rect(vec.x + x, vec.y + y, 5 * e.fout(), e.fout(), vec.angleTo(vec.x + x, vec.y + y)); + }); + }), + shelterRotate = new Effect(60f, e -> { if (!(e.data instanceof Block data)) return; diff --git a/src/omaloon/content/OlLiquids.java b/src/omaloon/content/OlLiquids.java index 2e6f0059..7cc040be 100644 --- a/src/omaloon/content/OlLiquids.java +++ b/src/omaloon/content/OlLiquids.java @@ -66,7 +66,7 @@ public static void addDensity(Liquid liquid, float density) { public static void addViscosity(Liquid liquid, float viscosity) { viscosities.put(liquid, viscosity); liquid.stats.remove(Stat.viscosity); - liquid.stats.add(Stat.viscosity, viscosity, OlStats.viscosityUnit); + liquid.stats.add(Stat.viscosity, Strings.autoFixed(viscosity/60f, 2), OlStats.viscosityUnit); } public static float getDensity(@Nullable Liquid liquid) { diff --git a/src/omaloon/content/blocks/OlDistributionBlocks.java b/src/omaloon/content/blocks/OlDistributionBlocks.java index a357d124..83564ab6 100644 --- a/src/omaloon/content/blocks/OlDistributionBlocks.java +++ b/src/omaloon/content/blocks/OlDistributionBlocks.java @@ -130,6 +130,9 @@ public static void load() { OlItems.cobalt, 20 ); pumpStrength = 0.1f; + + pumpEffectIn = OlFx.pumpIn; + pumpEffectOut = OlFx.pumpOut; }}; liquidValve = new PressureLiquidValve("liquid-valve") {{ @@ -142,6 +145,9 @@ public static void load() { Items.beryllium, 20 ); pressureLoss = 0.3f; + + pumpingEffectIn = OlFx.flowIn; + pumpingEffectOut = OlFx.flowOut; }}; liquidGauge = new PressureLiquidGauge("liquid-gauge") {{ @@ -153,8 +159,6 @@ public static void load() { OlItems.cobalt, 20, OlItems.carborundum, 10 ); - maxColor = Color.lightGray; - minColor = Color.darkGray; }}; //endregion } diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidPump.java b/src/omaloon/world/blocks/liquid/PressureLiquidPump.java index e3ee4a79..02f803c5 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidPump.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidPump.java @@ -10,6 +10,7 @@ import arc.util.io.*; import mindustry.*; import mindustry.content.*; +import mindustry.entities.*; import mindustry.entities.units.*; import mindustry.gen.*; import mindustry.graphics.*; @@ -35,6 +36,10 @@ public class PressureLiquidPump extends Block { public float liquidPadding = 3f; + public float effectInterval = 5f; + public Effect pumpEffectOut = Fx.none; + public Effect pumpEffectIn = Fx.none; + public TextureRegion[][] liquidRegions; public TextureRegion[] tiles; public TextureRegion arrowRegion, topRegion, bottomRegion; @@ -125,6 +130,7 @@ public void setStats() { public class PressureLiquidPumpBuild extends Building implements HasPressure { PressureModule pressure = new PressureModule(); + public float effectTimer; public int tiling; public float smoothAlpha; @@ -285,6 +291,17 @@ public void updateTile() { float flow = pumpStrength/chainSize() * ((backPressure + pumpEfficiency()) - frontPressure) / OlLiquids.getViscosity(pumpLiquid); + if (effectTimer >= effectInterval && !Mathf.zero(flow, 0.001f)) { + if (flow < 0) { + if (back == null && !(back() instanceof PressureLiquidPumpBuild)) pumpEffectOut.at(x, y, rotdeg() + 180f); + if (front == null && !(front() instanceof PressureLiquidPumpBuild)) pumpEffectIn.at(x, y, rotdeg()); + } else { + if (back == null && !(back() instanceof PressureLiquidPumpBuild)) pumpEffectIn.at(x, y, rotdeg() + 180f); + if (front == null && !(front() instanceof PressureLiquidPumpBuild)) pumpEffectOut.at(x, y, rotdeg()); + } + effectTimer %= 1; + } + if (pumpLiquid != null && front != null && back != null) { flow = Mathf.clamp(flow, -front.pressure().get(pumpLiquid), back.pressure().get(pumpLiquid)); } @@ -294,6 +311,7 @@ public void updateTile() { (front.acceptsPressurizedFluid(back, pumpLiquid, flow) && back.outputsPressurizedFluid(front, pumpLiquid, flow)) ) { + effectTimer += edelta(); if (front != null) front.addFluid(pumpLiquid, flow); if (back != null) back.removeFluid(pumpLiquid, flow); } diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidValve.java b/src/omaloon/world/blocks/liquid/PressureLiquidValve.java index 4d7eef33..6a598ec4 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidValve.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidValve.java @@ -35,8 +35,8 @@ public class PressureLiquidValve extends Block { public Effect jamEffect = Fx.explosion; public Sound jamSound = OlSounds.jam; - public Effect pumpingEffectOut = OlFx.pumpOut; - public Effect pumpingEffectIn = OlFx.pumpIn; + public Effect pumpingEffectOut = Fx.none; + public Effect pumpingEffectIn = Fx.none; public float pumpingEffectInterval = 15; public float pressureLoss = 1f; From ff117adf185cb8ff4b8f9154ae3836b11efc8b67 Mon Sep 17 00:00:00 2001 From: = Date: Mon, 13 Jan 2025 20:01:10 -0300 Subject: [PATCH 34/54] hints --- assets/bundles/bundle.properties | 8 +------ .../blocks/liquids/liquid-gauge-tiles.png | Bin 729 -> 724 bytes .../sprites/blocks/liquids/liquid-gauge.png | Bin 508 -> 502 bytes src/omaloon/ui/dialogs/EventHints.java | 20 +++--------------- .../blocks/liquid/PressureLiquidPump.java | 6 ++---- 5 files changed, 6 insertions(+), 28 deletions(-) diff --git a/assets/bundles/bundle.properties b/assets/bundles/bundle.properties index 9e3c6209..51026329 100644 --- a/assets/bundles/bundle.properties +++ b/assets/bundles/bundle.properties @@ -61,13 +61,7 @@ omaloon.update.dialog.fullclean.confirm = Are you sure you want to reset your cu requirement.omaloon-at-wave = Reach Wave {0} in {1} ## Hints -hint.omaloon-pump_positive = To create higher pressure, place \uC353[accent] mechanical pumps[] in series, adding liquid pipes between them.\nTo increase pressure faster, place \uC353[accent] mechanical pumps[] in parallel. -hint.omaloon-pump_negative = To decrease pressure faster, add more \uC353[accent]mechanical pumps[]. -hint.omaloon-drill_positive_pressure = \uC351 [accent]Hammer drills[] require negative pressure to operate. Rotate the \uC353[accent] mechanical pumps[] away from the drills to create negative pressure. -hint.omaloon-press_or_shelter_negative_pressure = Some buildings require positive pressure. Rotate the \uC353[accent] mechanical pumps[] to these blocks to create positive pressure. -hint.omaloon-pump = The pumps only stop when there is a block in front of it or the front block has enough pressure. -hint.omaloon-low_pressure = Buildings will implode when it reaches -50 pressure units. To avoid this, use \uC354 [accent]Liquid Valve[], which will reduce the pressure, preventing it from reaching dangerous levels. -hint.omaloon-valve = One valve can handle up to three pumps. If you have more pumps, place more valves to avoid jamming. +hint.omaloon-pump_chaining = Pumps chained in series can reach a higher pressure gradient between the ends. If they're chained in parallel, they work faster. ## planets planet.omaloon-omaloon.name = Omaloon diff --git a/assets/sprites/blocks/liquids/liquid-gauge-tiles.png b/assets/sprites/blocks/liquids/liquid-gauge-tiles.png index 6f9ad340582862b2cca383c546db3f192bfcc1c8..1b10b2d84b9c4aa0607e29148af712e0573148c2 100644 GIT binary patch delta 679 zcmcb~dWCg@Wqq5ci(^Q|oVQWde$0jfwcSAh3WY33R5M;Icy`%=E690bu|i>^uEUgt z3{rNcFEe(y91)zL@nXTOggG-e-h5NFZAQ3dr|tWrkH0=&tL?I5?w*?C_qTRF%-GIl z|NrL&Q%m)vI1N|1?iE2#CjY*@w8PEaIn?E&)FbPvXqI^d#m^n^1S5gM}M4Z``}(HR-Z_-|0yKdTIlVj(!rpHig#_3i-uflpa8&SL z{Dqp2KR2HGH}6ej#i2~6bqDKhSUnj}FHu;YyS2RFRA1w=$^9&uRqyh-wuHXje<5k5 z?S;0E5S~)QTX$}-T&M|KQtA->>8PB-Cxd{VUF(jf+vW%#J0*0$w8ORK$VLvo4Jt_v z*>!$TchAl=lD+lmbYbV`hHaB`nKI{R?$>5xSSjA{wAx9zzHZN|XYR(nF5(q+^?QEV z&YCLb_=KCutApcYB;!*5lWPAMv=21Z=p8sE&mg3({GHumhrL5Vy@L2V{v}B>=l9%^ zH}G%#&HUFFNHqLrE^<(Mekvx`x8*nUx7|qx&dJZ<_UL>er1q~t+-(`eh+o;B?s!@~W+g_?gD<`$$ZT_u{knE?nqUHx3v IIVCg!06u;~`~Uy| delta 684 zcmcb@dXsg6Wqr4&i(^Q|oVQUM{iGcQYTIK16h3lJtZ!=5Tj?A$v8lu(;0LqPQuc%F zF^pWYA`1@%wD+~m-|&NFiO9X$+1ato#jbJ|1B0BL{Bxxn_ii!OGw|5+gbMby&Pfn; ze8S>;WY*L<+&PNVlLXnqiVnR!E6K1R_x8-!i!X986jaq5yk}lHYlE%fg%d@8e(cQ8 zTHJX;aoGYFzyB8Y&u(R9`1RF^%I~jaS~j67$<5*A&--_O?+~zj`0G{N-&o&+(I<5c zT^LU*Y(HYee<;*ZrbT-8e}?)J_aA!}{CxEOv(@kFjqIN|(*=uo-)U-aRd{phd^elF zUuHvc!?QoBiO*jvR`1=fIYC69Nq5>U=F}XxK<(swbK8=`kC9=ecs)aO ze!>apsi!d9MOQ?US%KIBN*kL1T)6{V+dH$ zb4dPyz&{4XKaARk87m<3O}=3G3{{)`3|D? z%@SU>VaT;u2GE)NV(~-4}<~OsM1&0L;VP6D`7z)rvYyfr|tq2S^S0 z==M96$Q@>rrTRRpN*?B!MXB5Gs3K?^mLX?rDZbPQq>?*4-ai-aTZgTv09u6m2VVe+ z6|Rv>h2{hRa(@c~N(vmpfs;zEi76$ZZbSuyLq>v|7aCX!%*ol6SOcuB%G7~hgv_pV z7ihEo=Jv9zJDvjVOQq;&<684YQ;^~~1sXXJ*^E*Ki3T@nS;5^3n5=BI)JIwUA^03>=M za)2!okq!!|@>4@clS^2+1szly*2}!v*(kAimF?K`J@5QD>yYU6`TaY+wn<%F9l7|t zak6c=WMXyD7CbfKa`1Xt0{}i3iz2{5w+jI1>~~ZX&H@jznturJAkD;%6)pv~z*(%I z$_fvfO@;sf?|tKXuh#YO78bER1vv$w6VLEWEaLr7Sfo&^mARRK2EFUSB0(X3RBh~Bz0NX1RH=Y0amj->q5OCIbAAfi_IUZ~*uLGN8se-p30?00000NkvXXu0mjf D^$FA0 diff --git a/src/omaloon/ui/dialogs/EventHints.java b/src/omaloon/ui/dialogs/EventHints.java index b560ed27..a475501c 100644 --- a/src/omaloon/ui/dialogs/EventHints.java +++ b/src/omaloon/ui/dialogs/EventHints.java @@ -6,26 +6,12 @@ import arc.util.*; import mindustry.*; import mindustry.ui.fragments.HintsFragment.*; -import omaloon.content.blocks.*; +import omaloon.world.blocks.liquid.*; public enum EventHints implements Hint { -// drill_positive_pressure( -// () -> false, -// () -> Vars.state.teams.get(Vars.state.rules.defaultTeam).getBuildings(OlProductionBlocks.hammerDrill).find(b -> ((HasPressure) b).getPressure() > 0f) != null -// ), -// press_or_shelter_negative_pressure( -// () -> false, -// () -> Vars.state.teams.get(Vars.state.rules.defaultTeam).getBuildings(OlCraftingBlocks.carborundumPress).find(b -> ((HasPressure) b).getPressure() < 0f) != null -// || Vars.state.teams.get(Vars.state.rules.defaultTeam).getBuildings(OlDefenceBlocks.smallShelter).find(b -> ((HasPressure) b).getPressure() < 0f) != null -// ), - pump( + pump_chaining( () -> false, - () -> !Vars.state.teams.get(Vars.state.rules.defaultTeam).getBuildings(OlDistributionBlocks.liquidPump).isEmpty() - ), - valve( - () -> false, - () -> !Vars.state.teams.get(Vars.state.rules.defaultTeam).getBuildings(OlDistributionBlocks.liquidValve).isEmpty(), - pump + () -> Vars.control.input.block instanceof PressureLiquidPump ); final Boolp complete; diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidPump.java b/src/omaloon/world/blocks/liquid/PressureLiquidPump.java index 02f803c5..9bbae047 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidPump.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidPump.java @@ -50,9 +50,7 @@ public PressureLiquidPump(String name) { destructible = true; update = true; saveConfig = copyConfig = true; - config(Liquid.class, (PressureLiquidPumpBuild build, Liquid liquid) -> { - build.filter = liquid.id; - }); + config(Liquid.class, (PressureLiquidPumpBuild build, Liquid liquid) -> build.filter = liquid.id); } @Override @@ -153,7 +151,7 @@ public int chainSize() { } @Override public boolean connects(HasPressure to) { - return HasPressure.super.connects(to) && (front() == to || back() == to); + return HasPressure.super.connects(to) && (front() == to || back() == to) && (!(to instanceof PressureLiquidPumpBuild) || to.rotation() == rotation); } @Override From 1e126b26846b621576d39f869cdfa8491459e1ac Mon Sep 17 00:00:00 2001 From: = Date: Mon, 13 Jan 2025 22:04:44 -0300 Subject: [PATCH 35/54] flow that actually works --- src/omaloon/math/OlMath.java | 18 +++++++++++++++--- .../blocks/liquid/PressureLiquidValve.java | 18 ++++++++++++++++-- src/omaloon/world/meta/PressureSection.java | 14 ++++++++++---- 3 files changed, 41 insertions(+), 9 deletions(-) diff --git a/src/omaloon/math/OlMath.java b/src/omaloon/math/OlMath.java index 325467b2..38267560 100644 --- a/src/omaloon/math/OlMath.java +++ b/src/omaloon/math/OlMath.java @@ -11,8 +11,20 @@ public class OlMath { * * returns the amount of fluid in liquid units that passes through the area over a certain time. */ - public static float flowRate(float opening, float pressureStart, float pressureEnd, float viscosity) { - return opening * (pressureEnd - pressureStart) / (viscosity * 60f); + public static float flowRate(float pressureStart, float pressureEnd, float capacityStart, float capacityEnd, float density, float viscosity) { + return + ( + capacityStart * ( + pressureStart * ( + capacityStart + capacityEnd + ) - ( + pressureEnd * capacityEnd + pressureStart * capacityStart + ) + ) + ) / ( + density * ( + capacityStart + capacityEnd + ) * viscosity + ); } - // TODO rename } diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidValve.java b/src/omaloon/world/blocks/liquid/PressureLiquidValve.java index 6a598ec4..8930d09c 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidValve.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidValve.java @@ -217,12 +217,26 @@ public void updatePressure() { if (jammed) return; if (pressureAmount < openMin) { effectInterval += delta(); - addFluid(null, Math.min(openMin - pressureAmount, OlMath.flowRate(pressureLoss, 0, pressureAmount, OlLiquids.getViscosity(pressure.getMain())))); + addFluid(null, Math.min(openMin - pressureAmount, OlMath.flowRate( + 0, + pressureAmount, + 5, + pressureConfig.fluidCapacity, + OlLiquids.getDensity(null), + OlLiquids.getViscosity(null) + ))); draining = Mathf.approachDelta(draining, 1, 0.014f); } if (pressureAmount > openMax) { effectInterval += delta(); - removeFluid(pressure.getMain(), Math.min(pressureAmount - openMax, OlMath.flowRate(pressureLoss, pressureAmount, 0, OlLiquids.getViscosity(pressure.getMain())))); + removeFluid(pressure.getMain(), Math.min(pressureAmount - openMax, OlMath.flowRate( + pressureAmount, + 0, + pressureConfig.fluidCapacity, + 5, + OlLiquids.getDensity(null), + OlLiquids.getViscosity(null) + ))); draining = Mathf.approachDelta(draining, 1, 0.014f); } if (effectInterval > pumpingEffectInterval) { diff --git a/src/omaloon/world/meta/PressureSection.java b/src/omaloon/world/meta/PressureSection.java index c0f6461f..1f213873 100644 --- a/src/omaloon/world/meta/PressureSection.java +++ b/src/omaloon/world/meta/PressureSection.java @@ -102,9 +102,12 @@ public void updateTransfer() { Vars.content.liquids().each(main -> { amounts.clear(); for (Entry entry : links) { - float flow = OlMath.flowRate(entry.value.pressureConfig().fluidCapacity, - entry.key.pressure().getPressure(main), + float flow = OlMath.flowRate( entry.value.pressure().getPressure(main), + entry.key.pressure().getPressure(main), + entry.value.pressureConfig().fluidCapacity, + entry.key.pressureConfig().fluidCapacity, + OlLiquids.getDensity(main), OlLiquids.getViscosity(main) ) / (2f * links.size); @@ -142,9 +145,12 @@ public void updateTransfer() { }); amounts.clear(); for (Entry entry : links) { - float flow = OlMath.flowRate(entry.value.pressureConfig().fluidCapacity, - entry.key.pressure().getPressure(null), + float flow = OlMath.flowRate( entry.value.pressure().getPressure(null), + entry.key.pressure().getPressure(null), + entry.value.pressureConfig().fluidCapacity, + entry.key.pressureConfig().fluidCapacity, + OlLiquids.getDensity(null), OlLiquids.getViscosity(null) ) / (2f * links.size); From ff21f2827efa087b23227456821d69f71b6bebb4 Mon Sep 17 00:00:00 2001 From: = Date: Tue, 14 Jan 2025 02:16:28 -0300 Subject: [PATCH 36/54] pump fix (only on front) --- .../world/blocks/liquid/PressureLiquidPump.java | 10 +++++++--- src/omaloon/world/interfaces/HasPressure.java | 4 ++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidPump.java b/src/omaloon/world/blocks/liquid/PressureLiquidPump.java index 9bbae047..563833a3 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidPump.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidPump.java @@ -31,6 +31,7 @@ public class PressureLiquidPump extends Block { public PressureConfig pressureConfig = new PressureConfig(); public float pumpStrength = 0.1f; + public float efficiencyScale = 0.5f; public float pressureDifference = 10; @@ -211,10 +212,13 @@ public void draw() { public float pumpEfficiency() { float a = 0; - for(int i = 1; i <= chainSize(); i++) { - a += pressureDifference/i; + for(int i = 0; i < chainSize(); i++) { + a += pressureDifference * Mathf.pow(efficiencyScale, i); } - return a; + return a * ((pressureDifference)/((getFrom() == null ? pressureDifference : Math.max( + pressureDifference, + Math.abs(getFrom().pressure().getPressure(configurable ? Vars.content.liquid(filter) : getFrom().pressure().getMain())) + )))); } /** diff --git a/src/omaloon/world/interfaces/HasPressure.java b/src/omaloon/world/interfaces/HasPressure.java index 7538c734..604608c1 100644 --- a/src/omaloon/world/interfaces/HasPressure.java +++ b/src/omaloon/world/interfaces/HasPressure.java @@ -91,8 +91,8 @@ 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); + if (pressure().getPressure(liquid) < pressureConfig().minPressure - 1f) damage(pressureConfig().underPressureDamage); + if (pressure().getPressure(liquid) > pressureConfig().maxPressure + 1f) damage(pressureConfig().overPressureDamage); }); } } From f5df403a91e1a5a213fc569baf8a6645b90da092 Mon Sep 17 00:00:00 2001 From: = Date: Tue, 14 Jan 2025 13:23:45 -0300 Subject: [PATCH 37/54] fluid capacity stat --- assets/bundles/bundle.properties | 7 ++++++- src/omaloon/world/meta/OlStats.java | 4 ++++ src/omaloon/world/meta/PressureConfig.java | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/assets/bundles/bundle.properties b/assets/bundles/bundle.properties index 51026329..60685a05 100644 --- a/assets/bundles/bundle.properties +++ b/assets/bundles/bundle.properties @@ -331,6 +331,9 @@ stat.omaloon-add-fluid = Add Fluid air = Air stat.omaloon-remove-fluid = Remove Fluid +stat.omaloon-fluid-capacity = Fluid Capacity +stat.omaloon-fluid-capacity.format = @x@x@ Blocks + stat.omaloon-density = Density stat.omaloon-pump-strength = Pump Strength @@ -346,7 +349,9 @@ stat.omaloon-optimal-pressure = Optimal Pressure stat.omaloon-optimal-pressure.format = \uC357 @ Pascals (@%) ## ui units -unit.omaloon-density-unit = Pascals/Fluid Capacity +unit.omaloon-blocks-cubed = Blocks\u00B3 + +unit.omaloon-density-unit = Pascals/Blocks\u00B3 unit.omaloon-viscosity-unit = Pascal Seconds unit.omaloon-pressure-unit = Pascals diff --git a/src/omaloon/world/meta/OlStats.java b/src/omaloon/world/meta/OlStats.java index 76b4c2f3..6b173779 100644 --- a/src/omaloon/world/meta/OlStats.java +++ b/src/omaloon/world/meta/OlStats.java @@ -21,6 +21,8 @@ public class OlStats { addFluid = new Stat("omaloon-add-fluid", StatCat.crafting), removeFluid = new Stat("omaloon-remove-fluid", StatCat.crafting), + fluidCapacity = new Stat("omaloon-fluid-capacity", StatCat.liquids), + density = new Stat("omaloon-density"), pressureFlow = new Stat("omaloon-pressureflow", pressure), @@ -35,6 +37,8 @@ public class OlStats { optimalPressure = new Stat("omaloon-optimal-pressure", pressure); public static final StatUnit + blocksCubed = new StatUnit("omaloon-blocks-cubed"), + densityUnit = new StatUnit("omaloon-density-unit", "\uC357"), viscosityUnit = new StatUnit("omaloon-viscosity-unit", "\uC357"), diff --git a/src/omaloon/world/meta/PressureConfig.java b/src/omaloon/world/meta/PressureConfig.java index a350fd28..e95753d4 100644 --- a/src/omaloon/world/meta/PressureConfig.java +++ b/src/omaloon/world/meta/PressureConfig.java @@ -78,7 +78,7 @@ public class PressureConfig { }; public void addStats(Stats stats) { - stats.add(Stat.liquidCapacity, fluidCapacity, StatUnit.liquidUnits); + stats.add(OlStats.fluidCapacity, Core.bundle.get("stat.omaloon-fluid-capacity.format"), fluidCapacity/8f, fluidCapacity/8f, fluidCapacity/8f); stats.add(OlStats.maxPressure, maxPressure, OlStats.pressureUnit); stats.add(OlStats.minPressure, minPressure, OlStats.pressureUnit); From e3fc2ba30ef9c0fea163f40d2cdfece5677a8bf1 Mon Sep 17 00:00:00 2001 From: xstabux Date: Tue, 14 Jan 2025 16:00:21 +0200 Subject: [PATCH 38/54] pump sprite retouch (cherry picked from commit 725b6844f0fc63c7c28c94ce3545cbdf51609321) --- .../blocks/liquids/liquid-pump-tiles.png | Bin 1167 -> 1087 bytes .../blocks/liquids/liquid-pump-top.png | Bin 173 -> 163 bytes assets/sprites/blocks/liquids/liquid-pump.png | Bin 606 -> 539 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/sprites/blocks/liquids/liquid-pump-tiles.png b/assets/sprites/blocks/liquids/liquid-pump-tiles.png index e82cb5309d0e3af37b0cbbf48e66762eaa4548e9..792a5fb3cc79b986789a6cf0211dc4d077853842 100644 GIT binary patch delta 1054 zcmV+(1mXLS3BL%CFnTS&q>4ce z1Vrs@gJ3O)e?pLeaLt)21X4w?xx)2tkmVW`5>lqHiH)<&&AoZ^W_D)wH2L5l?Creo zeeb<{^J6y!3=9XK&j8@?V8{Fl0B~}2OkP*Ga&?Zpe*eKU0Dr*x#=U|YpPFBaT>6#X zT>K_FHfMYT#zD7b6P$}bT|-vO#g> z!B;SyP~-|ePJg7}k5L3v@TL4Q^ylCg6@VFhia>HtC_?$06ag1}DSs3Fx%fM_)uyju z>KZjx$Kk<_b+sFVUk{ufP#1iIZ@VVZ-zGl*6fd4UJp<^)LP%9f$C%<{@VmB{@7{h8 zO?R)~JQr@X!)Q~8f=}`lnr;ns zZd*H+>JRlLL^s7b(E)seUyUnvapn6<$dUZmNYM#$qH}U|4D~UgZ=+1;iRX%dvY~T^ z^3Ou@6@NHiT>9I_L`?BkF$i*K6K4${4VAJ1*FFGf=3%J1f!Bht@VJ=#@)*N!bFaIpVbsRm5 zxaa`q98(?O(dHHa``k1tOKVkA=hh0n`5t&WR47 zf)DTq6qM7h8D#&O#AzKKu(OfyMITQY~O^;WmIcj&nASzkemig!1q2ZF?OI*&Yk~ zK7WY|O}?&w_3^79ev{iL2D<+L;%T5yC*a-*kiIYA;tbU<<)^r%F)%sm0#Ls`g_Q3D zm|QXVB>|8GSaMI(lRVz%%?|Qw8g6mzvnEEO0x%dH~ zkoCdoI)P=`{f_2=U6NLP=# zLFzP5za}N$-`g%y@Hb69HCDG7Q-7QMz~BE20_+PLbIW$)`Zd;|dAMPl-%atk`K3s$ z-!%oN)?ZHnR5jZ6>pq}tP+U3rbByI|NV{GR{S#{d-LV+tlr2tt4*ry5B(`!UUl(HQ Y4+Or5vSgw8I{*Lx07*qoM6N<$g10IOd;kCd delta 1134 zcmV-!1d;o{2#*PnFn4e-6#n**6qXV}ZNib#Kq^l{8bvEXQpKPK z0-|=dL9iCYpCA$t(!{GmAXS7kDZKm!Ij&J5A!Q1i*f`7V+?zM=&Fs#ukPi;R-pu>n z_ukvLGqaZh4tBP`T>!wr{+9a{0O0K8l)P?m?fNWv{o$h*0DpkB^#=tvziECca_KjE zbMd?A`JB-PjDu~lXE1tIQ=>JU6chtIaY@glnsh2Cx4E)oQ<4C5VBEd9NHf4 z003srC*=2kuFe4f)>qd=&Y5;tH~;crP+sfL^+mq;FrJLdzmG;E5x+)%NPCm~01$M* zzy#mGb;6JvXn&k&g1?R;pn@;uuS0(heo+Cq!3U}VrX18b5yS7=4*94p0xtMc{uKSW z_@qJ+bgaJ ze5Y6;ej8m%zJas|IQ?y4Y7H=RKEa)PtHFtO;>VM5usbXd1~@((2JK4uQ=mB$(12SL z`1CjB3kRE%+y!V1aMv!;eN1%#AMC}8uRTk~Xn)bQMNa>r#c8Ts| zsslXP*aQ%6=|`hcS>2N4_viZPZ*1c0myhf?DSrx@D%Qsfb-#hI0-D478XkZv-5WW(2i@L$z1YJe|#tBaQs~0_I5w1 z4u*WMg|%HQhthC z8UvT3EC6%&8N?QWB>66vls~lyBmtI;NqSu40 zANcp5L4bc@<8Ik*-MqmXbPqRt&v#dRZhk46)*pHVH?6;X1W?uJ+plXt*`T;`^5>Y# z*^qX<9QrG30Nb%T$SGT#_#FIA&XL&4nS6<@znXN21cUVQKL7v#07*qoM6N<$g7fDw AVgLXD diff --git a/assets/sprites/blocks/liquids/liquid-pump-top.png b/assets/sprites/blocks/liquids/liquid-pump-top.png index 72083caee7bc222f82692081f46951d715c22061..2eee05b2e5582103e112143fc73d04b80ad36e3f 100644 GIT binary patch delta 134 zcmV;10D1qd0iywsB!2;OQb$4nuFf3k00018NklF%G~W3`5a```@`;x`4z` z+k)l410+@wr~&{Oo{v+bo#s=aZmHH#1FY0Z$P?H#{W}ROKq7>_0(JMX04_VgwP(0% oe(VSn&8vbp;2xtS@f8CAUhG0F0NZ(1&;S4c07*qoM6N<$g2)~>j{pDw delta 145 zcmV;C0B--I0j&X$B!3BTNLh0L01FcU01FcV0GgZ_0001ANklK@Pwm2t-lv z{&%*UZZt6|%(UJ7w^t^BMgRZ|=B;x!9mSUmGfQ_4HNdXg3AqEOqE93-b6vzJw#i4G+g6(n~ zeg_>o+Nn@FRiPDxLi-W?5d8=aLczs$62Zxi4!!SCt5#Sjj9k_xRPl?!IgYXco{I^6u@T; zC28C3+{9FjnyYIx?EG#*n+fi!I3^TRnt`-%jtQM5&B43CIVP+Ic7=0Ii2Iw{^(mMx z^DOuzo&W&CAb+%up`gY5a(yiqvpG~VbyhBKg`3wtIdo>?5$MIm7tS?d7O;&ykXyxU zxUUJSgp;S>FLkhOfVqiWcPGvGz2AWi1GQ$$d921!l&UWbLe!cqw*h?s*TgnB#Q*^L z@i~QRu8A(7FI-7yChh>Y43DG83HK?-dw&=FpSNM5RC>w8gb!S2NeZ6U1ZU-nDQ$4B zi8TKS3#E!*C8QGNR&k^)2800000NkvXXu0mjf DrNQpv delta 581 zcmV-L0=oU11l|OYB!3BTNLh0L01FcU01FcV0GgZ_0006INklZu}T9$5QhIf zLJI99g4%?`R|f<{vpP#7Jn8?Vti}&1OQNPR1J*> z5}cke3(;JZkubm)W@SRkL0QHHm(=NX0RY9xNL>G#D+2%;hjo>?dZTKLFWicouy8A_ z36%j32Y^ZxC64bOA5(iYCIVNr`@mf>>0GKo|Khg@T_&{fJSHqN;DNkw9}|=n@Xh~$ z`1Jb(UPczJzuCJM`8!bByCGEHdO zmogKNKpK^r5$glz470hm9zTN8>IMM$kA!cVO@n_tKg2Qhuc3AfXTiB*1NQ3wYeEC3 ztU!Y2HQ{sRmKnI=00000NkvXXu0mjf4SfQ2 From 5af549eca2be29671dd9e5086dd73b159546f5dd Mon Sep 17 00:00:00 2001 From: = Date: Tue, 14 Jan 2025 17:00:35 -0300 Subject: [PATCH 39/54] some fixes --- .../blocks/liquid/PressureLiquidGauge.java | 10 +++++++++- .../blocks/liquid/PressureLiquidPump.java | 7 ++----- .../blocks/sandbox/PressureLiquidSource.java | 19 ++++++++++++++++++- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidGauge.java b/src/omaloon/world/blocks/liquid/PressureLiquidGauge.java index 0384688e..6db247cf 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidGauge.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidGauge.java @@ -116,7 +116,15 @@ public void draw() { pressure().getPressure(pressure().getMain()) > 0 ? maxColor : minColor, Math.abs(p) ); - Draw.rect(gaugeRegion, x, y, (rotdeg() + 90) % 180 - 90 + (Math.abs(p) > 1 ? Mathf.randomSeed((long) Time.time, -360f, 360f) : p * 180f)); + Draw.rect(gaugeRegion, + x, + y, + (rotdeg() + 90) % 180 - 90 + ( + pressure().getPressure(pressure().getMain()) > pressureConfig.maxPressure + 1 || + pressure().getPressure(pressure().getMain()) < pressureConfig.minPressure - 1 + ? Mathf.randomSeed((long) Time.time, -360f, 360f) : p * 180f + ) + ); } @Override diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidPump.java b/src/omaloon/world/blocks/liquid/PressureLiquidPump.java index 563833a3..91944109 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidPump.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidPump.java @@ -213,12 +213,9 @@ public void draw() { public float pumpEfficiency() { float a = 0; for(int i = 0; i < chainSize(); i++) { - a += pressureDifference * Mathf.pow(efficiencyScale, i); + a += pressureDifference; } - return a * ((pressureDifference)/((getFrom() == null ? pressureDifference : Math.max( - pressureDifference, - Math.abs(getFrom().pressure().getPressure(configurable ? Vars.content.liquid(filter) : getFrom().pressure().getMain())) - )))); + return a; } /** diff --git a/src/omaloon/world/blocks/sandbox/PressureLiquidSource.java b/src/omaloon/world/blocks/sandbox/PressureLiquidSource.java index 95a8a056..bbea7edb 100644 --- a/src/omaloon/world/blocks/sandbox/PressureLiquidSource.java +++ b/src/omaloon/world/blocks/sandbox/PressureLiquidSource.java @@ -36,6 +36,13 @@ public PressureLiquidSource(String name) { config(SourceEntry.class, (PressureLiquidSourceBuild build, SourceEntry entry) -> { build.liquid = entry.fluid == null ? -1 : entry.fluid.id; build.targetAmount = entry.amount; + + Vars.content.liquids().each(liquid -> { + build.pressure.liquids[liquid.id] = 0; + build.pressure.pressures[liquid.id] = 0; + }); + + build.pressure.air = build.pressure.pressure = 0; }); } @@ -76,6 +83,11 @@ public class PressureLiquidSourceBuild extends Building implements HasPressure { public int liquid = -1; public float targetAmount; + @Override + public boolean acceptsPressurizedFluid(HasPressure from, Liquid liquid, float amount) { + return HasPressure.super.acceptsPressurizedFluid(from, liquid, amount) && liquid == Vars.content.liquid(this.liquid); + } + @Override public void buildConfiguration(Table cont) { cont.table(Styles.black6, table -> { @@ -140,6 +152,11 @@ public void onProximityUpdate() { new PressureSection().mergeFlood(this); } + @Override + public boolean outputsPressurizedFluid(HasPressure to, Liquid liquid, float amount) { + return HasPressure.super.outputsPressurizedFluid(to, liquid, amount) && liquid == Vars.content.liquid(this.liquid); + } + @Override public PressureModule pressure() { return pressure; } @@ -158,7 +175,7 @@ public void read(Reads read, byte revision) { @Override public void updateTile() { - super.updateTile(); + pressure.section.updateTransfer(); float difference = (Vars.content.liquid(liquid) == null ? targetAmount : Mathf.maxZero(targetAmount)) - (Vars.content.liquid(liquid) == null ? pressure.air : pressure.liquids[liquid]); From 808bfee8da6598ebd8407ebdb0664341529b29ba Mon Sep 17 00:00:00 2001 From: = Date: Sun, 19 Jan 2025 18:55:23 -0300 Subject: [PATCH 40/54] gauge resprite again remove fluidCapacity for pump add pressure bar for liquid source --- .../blocks/liquids/liquid-gauge-pointer.png | Bin 211 -> 157 bytes .../blocks/liquids/liquid-gauge-tiles.png | Bin 724 -> 576 bytes assets/sprites/blocks/liquids/liquid-gauge.png | Bin 502 -> 432 bytes .../world/blocks/liquid/PressureLiquidPump.java | 3 +-- .../blocks/sandbox/PressureLiquidSource.java | 11 +++++++++++ 5 files changed, 12 insertions(+), 2 deletions(-) diff --git a/assets/sprites/blocks/liquids/liquid-gauge-pointer.png b/assets/sprites/blocks/liquids/liquid-gauge-pointer.png index b8df1cbfab802b4dbcce9b423e55c6f28e73cd46..8cfa110f9d6a3f758261f8252dcb7544f402dbbb 100644 GIT binary patch delta 107 zcmV-x0F?jJ0i6MmIb=^sL_t(oh3%C|3IHGs#9IIV=kX>e^xz;AA-Q)9bTI;;nRE*! zX$#7EkNMEA*>|a-w*%*U;;B~6dF}a|1|&r N002ovPDHLkV1h%@Da-%> delta 162 zcmbQsc$sm6Wqqrsi(^PcYjT1F>*55Fo~A&90}T^ndiVXy{6F#MZ1ZzUr*$@&ER6Q+ zRQ9;maJq;M2(pchMfNS)qr?mZ&J{hze$_KFQZ0=lcBbh2)v8!F$eiZ1Y|`Rez!Gqj z(cOQp(h9b4D}|GcKY}dn+#h(iIO|J4Dq`8mdQk&tr8LM+Ms|kvx77qLu;`s<00K`} KKbLh*2~7ay2s)Vn diff --git a/assets/sprites/blocks/liquids/liquid-gauge-tiles.png b/assets/sprites/blocks/liquids/liquid-gauge-tiles.png index 1b10b2d84b9c4aa0607e29148af712e0573148c2..afcea6c37646e325c468b450b6e3e67540834608 100644 GIT binary patch delta 531 zcmV+u0_^?N1;7N5IDY~1NklHAN%wT!p-z2V2sL2vO8g#9o| zTtb+f_~ZBCwf)@h!E>K?JFji~v`s>oR^qh~Q%mvKIiY(c0e@=6Yaq>? z1Mmk_{Q(P*gXkG5{y-E!10wlu*dt_i9ljRGAFQ$%aes*H5Mcj6iFoWB_yauP4@fQe z0|0U=fh)*)VzEMDqpri0 zg$z=5rY|#gxEv9jpz&hCtb{o;H{N_xwQWYYWvA`?qmREnU#so1WA2`sz-kKT@cv ztrli})==f7#NJ{k@aRX%azV?7@6uNN)3amEo$&mK0P7aVdBWar8-)beAKv;U-f&d# zU;Krdk3Tn_`Zw=QW5uCNr*-uQZCE`SPcKnep1ZZY;8b7ZvdR4{nN{!dxweG9-G3oz zrR{~bju4(w!&`T5uw1AKTT2zV|=Z0;QbD1*dXYSW#V^}HP@U+@VxxQ}Cs%P%TzAoYwK;|#o zSyROvpKvpIb#R=FWL)ZhQtcmu_JO7vy#uG@8HCi8zq4EHuy-h^R}g>4za(kq{GL1V z2L6q|ng99%iH6_IMGi{OPsPOgw)|%Pwma#-Ir$mf9-S|Q)c!SS9B^_e3cq9a=r{Ax z@WVg&XX_ka*pb5Z=bwXgL4Csmpf&Xe{x<5JEXHr@v)xHw4Rf4bKK*N$s_&40(RbOS z52AI2jNISZ*W8;W{A;(=v_lG^3t#_cUiP^`>%d>eUYpS4e;J#8Gg}(okuRt}V8i;3 z|BE@0V0g!Wg0XXsc5$hx;5+^q@4FPwo@Y(_$FOjJaG~ZOhPeePOIL~JZe{=iPgg&e IbxsLQ0RB@#-Ie%hFL_t(oh1Hikj>0eyhR2c5!Q%$0prG7(MVW@08&E*cL)sf4 zN*c5kqNb#P$~WL~5vT(8cWt^scZBDC`YCaqyWd~g0u12lJjKuV!EZkKD&odNf>f&!&8ZL{NO_t<4V-?h8 z-zflBfXU}#T&_=B$8rG)aVED*B8O`N e>JTBr0RUcpEWkREWyp^J0000>VaT;u2GE)NV(~-4}<~OsM1&0L;VP6D`7z)rvYyfr|tq2S^S0 z==M96$Q@>rrTRRpN*?B!MXB5Gs3K?^mLX?rDZbPQq>?*4-ai-aTZgTv09u6m2VVe+ z6|Rv>h2{hRa(@c~N(vmpfs;zEi76$ZZbSuyLq>v|7aCX!%*ol6SOcuB%G7~hgv_pV z7ihEo=Jv9zJDvjVOQq;&<684YQ;^~~1sXXJ*^E*Ki3T@nS; { + HasPressure build = (HasPressure)entity; + + return new CenterBar( + () -> Core.bundle.get("bar.pressure") + (build.pressure().getPressure(build.pressure().getMain()) < 0 ? "-" : "+") + Strings.autoFixed(Math.abs(build.pressure().getPressure(build.pressure().getMain())), 2), + () -> Color.white, + () -> Mathf.map(build.pressure().getPressure(build.pressure().getMain()), pressureConfig.minPressure, pressureConfig.maxPressure, -1, 1) + ); + }); } public class PressureLiquidSourceBuild extends Building implements HasPressure { From 460fdea2ce800c4fd594e8057e12fdbe1627f45f Mon Sep 17 00:00:00 2001 From: = Date: Sun, 19 Jan 2025 23:18:49 -0300 Subject: [PATCH 41/54] made javelin consume air gauge now shows the liquid (untested) --- .../content/blocks/OlDefenceBlocks.java | 26 +++++++++- .../blocks/liquid/PressureLiquidGauge.java | 52 +++++++++++++++++-- 2 files changed, 73 insertions(+), 5 deletions(-) diff --git a/src/omaloon/content/blocks/OlDefenceBlocks.java b/src/omaloon/content/blocks/OlDefenceBlocks.java index 71c263b7..324cac8d 100644 --- a/src/omaloon/content/blocks/OlDefenceBlocks.java +++ b/src/omaloon/content/blocks/OlDefenceBlocks.java @@ -18,6 +18,7 @@ import omaloon.content.*; import omaloon.world.blocks.defense.*; import omaloon.world.consumers.*; +import omaloon.world.meta.*; import static mindustry.type.ItemStack.*; @@ -257,7 +258,7 @@ public void draw(Bullet b){ }}; }}; - //TODO: 0.2, but let this be sandbox only + //TODO: 0.2, but let this be sandbox only (this needs a massive nerf lmao) javelin = new ConsumeTurret("javelin") {{ requirements(Category.turret, BuildVisibility.sandboxOnly, with()); outlineColor = Color.valueOf("2f2f36"); @@ -288,7 +289,24 @@ public void draw(Bullet b){ }}; shootSound = OlSounds.theShoot; - consumeItem(Items.coal, 1); + consumeItems(with( + Items.coal, 1, + OlItems.carborundum, 3 + )); + consume(new ConsumeFluid(null, 36) {{ + startRange = 1.8f; + endRange = 18f; + + curve = t -> Math.min( + 2f * t, + -2 * t + 2 + ); + + hasOptimalPressure = true; + optimalPressure = 9f; + + efficiencyMultiplier = 2f; + }}); shootType = new BasicBulletType(1.6f, 12f, "omaloon-javelin-missile-outlined"){{ lifetime = 40f; ammoMultiplier = 1f; @@ -369,6 +387,10 @@ public void draw(Bullet b){ }}); }}; }}; + + pressureConfig = new PressureConfig() {{ + fluidCapacity = 20; + }}; }}; //endregion //region walls diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidGauge.java b/src/omaloon/world/blocks/liquid/PressureLiquidGauge.java index 6db247cf..61a37dbe 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidGauge.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidGauge.java @@ -9,6 +9,7 @@ import arc.util.io.*; import mindustry.entities.units.*; import mindustry.gen.*; +import mindustry.graphics.*; import mindustry.type.*; import mindustry.world.*; import omaloon.ui.elements.*; @@ -16,13 +17,19 @@ import omaloon.world.meta.*; import omaloon.world.modules.*; +import static mindustry.Vars.*; +import static mindustry.type.Liquid.*; + public class PressureLiquidGauge extends Block { public PressureConfig pressureConfig = new PressureConfig(); public Color maxColor = Color.white, minColor = Color.white; + public TextureRegion[][] liquidRegions; public TextureRegion[] tileRegions; - public TextureRegion gaugeRegion; + public TextureRegion bottomRegion, gaugeRegion; + + public float liquidPadding = 3f; public PressureLiquidGauge(String name) { super(name); @@ -52,7 +59,7 @@ public void drawPlanRegion(BuildPlan plan, Eachable list) { @Override public TextureRegion[] icons() { - return new TextureRegion[]{region}; + return new TextureRegion[]{bottomRegion, region}; } @Override @@ -66,7 +73,28 @@ public void init() { public void load() { super.load(); tileRegions = Core.atlas.find(name + "-tiles").split(32, 32)[0]; - gaugeRegion = Core.atlas.find(name + "-pointer"); + gaugeRegion = Core.atlas.find(name + "-pointer");; + bottomRegion = Core.atlas.find(name + "-bottom", "omaloon-liquid-bottom"); + + liquidRegions = new TextureRegion[2][animationFrames]; + if(renderer != null){ + var frames = renderer.getFluidFrames(); + + for (int fluid = 0; fluid < 2; fluid++) { + for (int frame = 0; frame < animationFrames; frame++) { + TextureRegion base = frames[fluid][frame]; + TextureRegion result = new TextureRegion(); + result.set(base); + + result.setHeight(result.height - liquidPadding); + result.setWidth(result.width - liquidPadding); + result.setX(result.getX() + liquidPadding); + result.setY(result.getY() + liquidPadding); + + liquidRegions[fluid][frame] = result; + } + } + } } @Override @@ -94,6 +122,7 @@ public class PressureLiquidGaugeBuild extends Building implements HasPressure { PressureModule pressure = new PressureModule(); public int tiling; + public float smoothAlpha; @Override public boolean acceptsPressurizedFluid(HasPressure from, @Nullable Liquid liquid, float amount) { @@ -109,7 +138,22 @@ public boolean connects(HasPressure to) { @Override public void draw() { + Draw.rect(bottomRegion, x, y); + Liquid main = pressure.getMain(); + + smoothAlpha = Mathf.approachDelta(smoothAlpha, main == null ? 0f : pressure.liquids[main.id]/(pressure.liquids[main.id] + pressure.air), PressureModule.smoothingSpeed); + + if (smoothAlpha > 0.001f) { + int frame = pressure.current.getAnimationFrame(); + int gas = pressure.current.gas ? 1 : 0; + + float xscl = Draw.xscl, yscl = Draw.yscl; + Draw.scl(1f, 1f); + Drawf.liquid(liquidRegions[gas][frame], x, y, Mathf.clamp(smoothAlpha), pressure.current.color.write(Tmp.c1).a(1f)); + Draw.scl(xscl, yscl); + } Draw.rect(tileRegions[tiling], x, y, tiling == 0 ? 0 : (rotdeg() + 90) % 180 - 90); + float p = Mathf.map(pressure().getPressure(pressure().getMain()), pressureConfig.minPressure, pressureConfig.maxPressure, -1, 1); Draw.color( Color.white, @@ -155,6 +199,7 @@ public boolean outputsPressurizedFluid(HasPressure to, Liquid liquid, float amou public void read(Reads read, byte revision) { super.read(read, revision); pressure.read(read); + smoothAlpha = read.f(); } @Override @@ -166,6 +211,7 @@ public void updateTile() { public void write(Writes write) { super.write(write); pressure.write(write); + write.f(smoothAlpha); } } } From 3ec76f2dd5b4c4c5d9d0d23d624fb2b88c226568 Mon Sep 17 00:00:00 2001 From: = Date: Mon, 20 Jan 2025 22:02:56 -0300 Subject: [PATCH 42/54] pump blows up earlier --- assets/bundles/bundle.properties | 1 + .../content/blocks/OlDistributionBlocks.java | 12 ++- src/omaloon/math/OlMath.java | 15 ++-- src/omaloon/ui/dialogs/EventHints.java | 6 ++ .../blocks/liquid/PressureLiquidGauge.java | 1 + .../blocks/liquid/PressureLiquidPump.java | 73 +++++++++++++------ 6 files changed, 80 insertions(+), 28 deletions(-) diff --git a/assets/bundles/bundle.properties b/assets/bundles/bundle.properties index 60685a05..61c39982 100644 --- a/assets/bundles/bundle.properties +++ b/assets/bundles/bundle.properties @@ -62,6 +62,7 @@ requirement.omaloon-at-wave = Reach Wave {0} in {1} ## Hints hint.omaloon-pump_chaining = Pumps chained in series can reach a higher pressure gradient between the ends. If they're chained in parallel, they work faster. +hint.omaloon-pump_min_max_pressure = Pumps can only pump out so much before the pressure starts damaging them. ## planets planet.omaloon-omaloon.name = Omaloon diff --git a/src/omaloon/content/blocks/OlDistributionBlocks.java b/src/omaloon/content/blocks/OlDistributionBlocks.java index 83564ab6..96b03258 100644 --- a/src/omaloon/content/blocks/OlDistributionBlocks.java +++ b/src/omaloon/content/blocks/OlDistributionBlocks.java @@ -2,6 +2,7 @@ import arc.graphics.*; import mindustry.content.*; +import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; import mindustry.world.*; @@ -9,6 +10,7 @@ import omaloon.content.*; import omaloon.world.blocks.distribution.*; import omaloon.world.blocks.liquid.*; +import omaloon.world.meta.*; import static mindustry.type.ItemStack.*; @@ -129,10 +131,18 @@ public static void load() { researchCost = with( OlItems.cobalt, 20 ); - pumpStrength = 0.1f; + pumpStrength = 5f/60f; + + ambientSound = Sounds.wind2; + ambientSoundVolume = 0.1f; pumpEffectIn = OlFx.pumpIn; pumpEffectOut = OlFx.pumpOut; + + pressureConfig = new PressureConfig() {{ + minPressure = -25f; + maxPressure = 25f; + }}; }}; liquidValve = new PressureLiquidValve("liquid-valve") {{ diff --git a/src/omaloon/math/OlMath.java b/src/omaloon/math/OlMath.java index 38267560..3a5fee21 100644 --- a/src/omaloon/math/OlMath.java +++ b/src/omaloon/math/OlMath.java @@ -3,13 +3,16 @@ public class OlMath { /** * Solves for the flow of a fluid through an area based on a difference of pressure. + *

* - * area is in world units squared. - * pressureStart and pressureEnd are in pascals - * density is in liquid units / world units cubed - * time is in ticks - * - * returns the amount of fluid in liquid units that passes through the area over a certain time. + * returns the amount of fluid in liquid units that flows per tick */ public static float flowRate(float pressureStart, float pressureEnd, float capacityStart, float capacityEnd, float density, float viscosity) { return diff --git a/src/omaloon/ui/dialogs/EventHints.java b/src/omaloon/ui/dialogs/EventHints.java index a475501c..09ec93f5 100644 --- a/src/omaloon/ui/dialogs/EventHints.java +++ b/src/omaloon/ui/dialogs/EventHints.java @@ -12,6 +12,12 @@ public enum EventHints implements Hint { pump_chaining( () -> false, () -> Vars.control.input.block instanceof PressureLiquidPump + ), + pump_max_min_pressure( + () -> false, + () -> + Vars.state.rules.defaultTeam.data().buildings.contains(b -> b instanceof PressureLiquidPump.PressureLiquidPumpBuild) && + Vars.control.input.block instanceof PressureLiquidPump ); final Boolp complete; diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidGauge.java b/src/omaloon/world/blocks/liquid/PressureLiquidGauge.java index 61a37dbe..f760818b 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidGauge.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidGauge.java @@ -53,6 +53,7 @@ public void drawPlanRegion(BuildPlan plan, Eachable list) { if (new Point2(next.x, next.y).equals(back) && next.block.outputsLiquid) tiling.tiling |= inverted ? 1 : 2; }); + Draw.rect(bottomRegion, plan.drawx(), plan.drawy()); Draw.rect(tileRegions[tiling.tiling], plan.drawx(), plan.drawy(), (plan.rotation + 1) * 90f % 180 - 90); Draw.rect(gaugeRegion, plan.drawx(), plan.drawy(), plan.rotation * 90f); } diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidPump.java b/src/omaloon/world/blocks/liquid/PressureLiquidPump.java index 003f12dc..7ff559ca 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidPump.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidPump.java @@ -17,7 +17,9 @@ import mindustry.type.*; import mindustry.world.*; import mindustry.world.blocks.*; +import mindustry.world.meta.*; import omaloon.content.*; +import omaloon.math.*; import omaloon.utils.*; import omaloon.world.interfaces.*; import omaloon.world.meta.*; @@ -30,7 +32,6 @@ public class PressureLiquidPump extends Block { public PressureConfig pressureConfig = new PressureConfig(); public float pumpStrength = 0.1f; - public float efficiencyScale = 0.5f; public float pressureDifference = 10; @@ -121,7 +122,7 @@ public void setStats() { super.setStats(); pressureConfig.addStats(stats); stats.remove(OlStats.fluidCapacity); - stats.add(OlStats.pumpStrength, pumpStrength); + stats.add(OlStats.pumpStrength, pumpStrength, StatUnit.liquidSecond); stats.add(OlStats.pressureGradient, pressureDifference, OlStats.pressureUnit); } @@ -132,12 +133,19 @@ public class PressureLiquidPumpBuild extends Building implements HasPressure { public int tiling; public float smoothAlpha; + public boolean functioning; + public int filter = -1; @Override public boolean acceptsPressurizedFluid(HasPressure from, @Nullable Liquid liquid, float amount) { return false; } + @Override + public float ambientVolume() { + return 1f/chainSize(); + } + @Override public void buildConfiguration(Table table) { ItemSelection.buildTable(table, Vars.content.liquids(), () -> Vars.content.liquid(filter), other -> filter = other == null ? -1 : other.id); @@ -209,14 +217,6 @@ public void draw() { if (tiling == 0) Draw.rect(topRegion, x, y, rotdeg()); } - public float pumpEfficiency() { - float a = 0; - for(int i = 0; i < chainSize(); i++) { - a += pressureDifference; - } - return a; - } - /** * Returns the building at the start of the pump chain. */ @@ -275,9 +275,13 @@ public void read(Reads read, byte revision) { smoothAlpha = read.f(); } + @Override + public boolean shouldAmbientSound() { + return functioning; + } + @Override public void updateTile() { - super.updateTile(); if (efficiency > 0) { HasPressure front = getTo(); HasPressure back = getFrom(); @@ -287,22 +291,43 @@ public void updateTile() { float frontPressure = front == null ? 0 : front.pressure().getPressure(pumpLiquid); float backPressure = back == null ? 0 : back.pressure().getPressure(pumpLiquid); - float flow = pumpStrength/chainSize() * ((backPressure + pumpEfficiency()) - frontPressure) / OlLiquids.getViscosity(pumpLiquid); - - if (effectTimer >= effectInterval && !Mathf.zero(flow, 0.001f)) { - if (flow < 0) { - if (back == null && !(back() instanceof PressureLiquidPumpBuild)) pumpEffectOut.at(x, y, rotdeg() + 180f); - if (front == null && !(front() instanceof PressureLiquidPumpBuild)) pumpEffectIn.at(x, y, rotdeg()); + float maxFlow = OlMath.flowRate( + backPressure + pressureDifference * chainSize(), + frontPressure, + back == null ? 5 : back.pressureConfig().fluidCapacity, + front == null ? 5 : front.pressureConfig().fluidCapacity, + OlLiquids.getDensity(pumpLiquid), + 1 + ); + + if (effectTimer >= effectInterval && !Mathf.zero(maxFlow, 0.001f)) { + if (maxFlow < 0) { + if (back == null && !(back() instanceof PressureLiquidPumpBuild && back().rotation == rotation)) pumpEffectOut.at(x, y, rotdeg() + 180f); + if (front == null && !(front() instanceof PressureLiquidPumpBuild && back().rotation == rotation)) pumpEffectIn.at(x, y, rotdeg()); } else { - if (back == null && !(back() instanceof PressureLiquidPumpBuild)) pumpEffectIn.at(x, y, rotdeg() + 180f); - if (front == null && !(front() instanceof PressureLiquidPumpBuild)) pumpEffectOut.at(x, y, rotdeg()); + if (back == null && !(back() instanceof PressureLiquidPumpBuild && front().rotation == rotation)) pumpEffectIn.at(x, y, rotdeg() + 180f); + if (front == null && !(front() instanceof PressureLiquidPumpBuild && front().rotation == rotation)) pumpEffectOut.at(x, y, rotdeg()); } effectTimer %= 1; } - if (pumpLiquid != null && front != null && back != null) { - flow = Mathf.clamp(flow, -front.pressure().get(pumpLiquid), back.pressure().get(pumpLiquid)); + if (back != null) { + pressure.pressure = back.pressure().getPressure(pumpLiquid); + updatePressure(); } + if (front != null) { + pressure.pressure = front.pressure().getPressure(pumpLiquid); + updatePressure(); + } + pressure.pressure = 0; + + float flow = Mathf.clamp( + (maxFlow > 0 ? pumpStrength : -pumpStrength)/chainSize() * Time.delta, + -Math.abs(maxFlow), + Math.abs(maxFlow) + ); + + functioning = !Mathf.zero(flow, 0.001f); if ( front == null || back == null || @@ -316,6 +341,12 @@ public void updateTile() { } } + @Override + public void updatePressure() { + if (pressure().pressure < pressureConfig().minPressure - 1f) damage(pressureConfig().underPressureDamage); + if (pressure().pressure > pressureConfig().maxPressure + 1f) damage(pressureConfig().overPressureDamage); + } + @Override public void write(Writes write) { super.write(write); From 4122b37a764d4475f79090c14b5d7fa54fe56cbc Mon Sep 17 00:00:00 2001 From: = Date: Mon, 20 Jan 2025 22:55:01 -0300 Subject: [PATCH 43/54] some tweaks --- assets/bundles/bundle.properties | 2 +- .../blocks/liquid/PressureLiquidJunction.java | 2 +- .../blocks/liquid/PressureLiquidPump.java | 10 +++--- src/omaloon/world/meta/PressureSection.java | 31 ++++++++++++++----- 4 files changed, 31 insertions(+), 14 deletions(-) diff --git a/assets/bundles/bundle.properties b/assets/bundles/bundle.properties index 61c39982..ed295b9d 100644 --- a/assets/bundles/bundle.properties +++ b/assets/bundles/bundle.properties @@ -62,7 +62,7 @@ requirement.omaloon-at-wave = Reach Wave {0} in {1} ## Hints hint.omaloon-pump_chaining = Pumps chained in series can reach a higher pressure gradient between the ends. If they're chained in parallel, they work faster. -hint.omaloon-pump_min_max_pressure = Pumps can only pump out so much before the pressure starts damaging them. +hint.omaloon-pump_max_min_pressure = Pumps can only pump out so much before the pressure starts damaging them. ## planets planet.omaloon-omaloon.name = Omaloon diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidJunction.java b/src/omaloon/world/blocks/liquid/PressureLiquidJunction.java index 1462277a..bdc99927 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidJunction.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidJunction.java @@ -37,7 +37,7 @@ public HasPressure getPressureDestination(HasPressure source, float pressure) { int dir = (source.relativeTo(tile.x, tile.y) + 4) % 4; HasPressure next = nearby(dir) instanceof HasPressure ? (HasPressure) nearby(dir) : null; - if(next == null || !(next.block() instanceof PressureLiquidJunction)){ + if(next == null) { return this; } return next.getPressureDestination(this, pressure); diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidPump.java b/src/omaloon/world/blocks/liquid/PressureLiquidPump.java index 7ff559ca..47a7edf8 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidPump.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidPump.java @@ -122,7 +122,7 @@ public void setStats() { super.setStats(); pressureConfig.addStats(stats); stats.remove(OlStats.fluidCapacity); - stats.add(OlStats.pumpStrength, pumpStrength, StatUnit.liquidSecond); + stats.add(OlStats.pumpStrength, pumpStrength * 60f, StatUnit.liquidSecond); stats.add(OlStats.pressureGradient, pressureDifference, OlStats.pressureUnit); } @@ -302,11 +302,11 @@ public void updateTile() { if (effectTimer >= effectInterval && !Mathf.zero(maxFlow, 0.001f)) { if (maxFlow < 0) { - if (back == null && !(back() instanceof PressureLiquidPumpBuild && back().rotation == rotation)) pumpEffectOut.at(x, y, rotdeg() + 180f); - if (front == null && !(front() instanceof PressureLiquidPumpBuild && back().rotation == rotation)) pumpEffectIn.at(x, y, rotdeg()); + if (back == null && !(back() instanceof PressureLiquidPumpBuild p && p.rotation == rotation)) pumpEffectOut.at(x, y, rotdeg() + 180f); + if (front == null && !(front() instanceof PressureLiquidPumpBuild p && p.rotation == rotation)) pumpEffectIn.at(x, y, rotdeg()); } else { - if (back == null && !(back() instanceof PressureLiquidPumpBuild && front().rotation == rotation)) pumpEffectIn.at(x, y, rotdeg() + 180f); - if (front == null && !(front() instanceof PressureLiquidPumpBuild && front().rotation == rotation)) pumpEffectOut.at(x, y, rotdeg()); + if (back == null && !(back() instanceof PressureLiquidPumpBuild p && p.rotation == rotation)) pumpEffectIn.at(x, y, rotdeg() + 180f); + if (front == null && !(front() instanceof PressureLiquidPumpBuild p && p.rotation == rotation)) pumpEffectOut.at(x, y, rotdeg()); } effectTimer %= 1; } diff --git a/src/omaloon/world/meta/PressureSection.java b/src/omaloon/world/meta/PressureSection.java index 1f213873..dfbbdda9 100644 --- a/src/omaloon/world/meta/PressureSection.java +++ b/src/omaloon/world/meta/PressureSection.java @@ -131,12 +131,20 @@ public void updateTransfer() { } } for (Entry entry : links) { + float maxFlow = OlMath.flowRate( + entry.value.pressure().getPressure(main), + entry.key.pressure().getPressure(main), + entry.value.pressureConfig().fluidCapacity, + entry.key.pressureConfig().fluidCapacity, + OlLiquids.getDensity(main), + 0 + ) / (2f * links.size); + 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 + amounts.get(links.indexOf(entry)) * Time.delta, + -Math.abs(maxFlow), + Math.abs(maxFlow) ); -// float flow = amounts.get(links.indexOf(entry)); if (flow != 0) { entry.key.addFluid(main, flow); entry.value.removeFluid(main, flow); @@ -172,10 +180,19 @@ public void updateTransfer() { } } for (Entry entry : links) { + float maxFlow = OlMath.flowRate( + entry.value.pressure().getPressure(null), + entry.key.pressure().getPressure(null), + entry.value.pressureConfig().fluidCapacity, + entry.key.pressureConfig().fluidCapacity, + OlLiquids.getDensity(null), + 0 + ) / (2f * links.size); + 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 + amounts.get(links.indexOf(entry)) * Time.delta, + -Math.abs(maxFlow), + Math.abs(maxFlow) ); if (flow != 0) { entry.key.addFluid(null, amounts.get(links.indexOf(entry))); From 453021595134fd0a02df95f522c9a4bfae7979ec Mon Sep 17 00:00:00 2001 From: = Date: Tue, 21 Jan 2025 19:48:54 -0300 Subject: [PATCH 44/54] filter pump (untested config thingy) --- assets/bundles/bundle.properties | 3 ++ .../blocks/liquids/filter-pump-arrow.png | Bin 0 -> 179 bytes .../blocks/liquids/filter-pump-filter.png | Bin 0 -> 220 bytes .../blocks/liquids/filter-pump-tiles.png | Bin 0 -> 1100 bytes .../blocks/liquids/filter-pump-top.png | Bin 0 -> 163 bytes assets/sprites/blocks/liquids/filter-pump.png | Bin 0 -> 546 bytes .../content/blocks/OlDistributionBlocks.java | 21 ++++++++- .../blocks/liquid/PressureLiquidPump.java | 43 ++++++++++++------ 8 files changed, 53 insertions(+), 14 deletions(-) create mode 100644 assets/sprites/blocks/liquids/filter-pump-arrow.png create mode 100644 assets/sprites/blocks/liquids/filter-pump-filter.png create mode 100644 assets/sprites/blocks/liquids/filter-pump-tiles.png create mode 100644 assets/sprites/blocks/liquids/filter-pump-top.png create mode 100644 assets/sprites/blocks/liquids/filter-pump.png diff --git a/assets/bundles/bundle.properties b/assets/bundles/bundle.properties index ed295b9d..b3086382 100644 --- a/assets/bundles/bundle.properties +++ b/assets/bundles/bundle.properties @@ -262,6 +262,9 @@ block.omaloon-liquid-tube.description = Moves liquids. block.omaloon-liquid-pump.name = Mechanical Pump block.omaloon-liquid-pump.description = Moves liquids forward. +block.omaloon-filter-pump.name = Filter +block.omaloon-filter-pump.description = Moves liquids forward. Liquid can be choosen manually + block.omaloon-liquid-junction.name = Liquid Junction block.omaloon-liquid-junction.description = Acts as a bridge for two crossing liquid tubes. diff --git a/assets/sprites/blocks/liquids/filter-pump-arrow.png b/assets/sprites/blocks/liquids/filter-pump-arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..9fa9e34ae3825962b60afd17c241c0bbaa4cdc90 GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND46Q$ z;usRq`gV#V-vI>AMA8JCXu5d}Utnz-_xxBI| zv|`%vIR#=5?rOc_w9oz~@Q$nOTg9WB?;J$mF@!#S{bzfNIiEOZ$%0)y!Fe@D85lk= Y#l(bvu;~jl0$Rx6>FVdQ&MBb@0N@`#jsO4v literal 0 HcmV?d00001 diff --git a/assets/sprites/blocks/liquids/filter-pump-filter.png b/assets/sprites/blocks/liquids/filter-pump-filter.png new file mode 100644 index 0000000000000000000000000000000000000000..f45278034a6e4c10e8e96b0ceb817d8dfabf15e0 GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWNDA?!e z;usRq`gZz8-Ub66mfWyL)ddSv1lSyT4k>769uhL>UMYN&agB&bee9Ya|JRxrPHybz z2;1LxI7?A!(YE(jt&BH^!X}92kxsA@G3h)T_pvuOJ3G5?ckeX$AQ1L;=bLY4 zvTt|pr2@fz@8bvny35D(BLKknPe0gkgF6pzv*U*!9svN>)*n~W`rQ0ll+thXmg1*q zxts|Nm;~FFOK>UvoNF|;B>g4$De3~?982K@XM^J^$zNivWTRve_-s@m4)qT90RX!j z^X%u(-dzF!)}O4YoHN^DYW}58rygrBv{k;iFgzdDzn=^SD*h1tKJ7XA0l@2kfeF3= zb;6JvggB9dKSdF6!PoMq&|iXoPBV!H9{^4-x@2U0PVZnpSrNqWp9}_d5e(0V!9^ei zU&G&2e<}W!>$GVbqTmd3W87LB-Q{EFX*UJG9XLCnKKO#4QvWph0ie44_HqR9hXrl$ zW7bgdDfoR?%$-+nRFAvu=bNglDu+=0uixHH#vh}P#3bJ}huY#QzbU^@Jm3$k zc8AcpW8x6lH2L-#YD;r4 z$(ekErdLCo+qE5Q^~d@WqnqO#+W|s@KRh3bhpW)Pgc8Y5jT}2cNz6&TW&18oVJBX? zW-WC(6DL_;KU>2;3&}T-c7i7QOJHmVu$v3o z=JEdPqH}?iXx~oo^xm1*As>GVg!BYb!KHs1zSx}XE#Mkg2i{gNJ+w$$bIklu{#gd+ zYg7HXalHdvaZKz0rx#tc7u?S#`%4z?GZ)$mZJb`T@!-ax=#Y;;1tdRn!KHs1zSx{& zJAnNSlhmN#oc1N3LQw-3gq9B9MIeCpv+2fa_OteQh6N#fS2*tZt2t`g=i*A=eq^sJ|Ct zCQ0&bUqbjPcSsCu&i~@uz>u9ldM7~pzJQN2R=<{?f-w@dH4m z`ODE5&UxU8<&R0eL1+?E>o3KxDgcgvHZhD!K_){dGuC;BZ)IUvr;O~D10q%p1c}^SLx_?tNNShn3=Q|Z&nqQ0D`h7ca zZvFMATs2bi7;rW?u9EyE)=D|aRZ2bXG)>`p` SbvUm80000Ac&5+<~Qi9upsfAHeD&w>}`t-Kb%yylAM3E>;2 zf2}#S9h6%3GL?Sc$e?F^U~Br0?7BA`!e>`EnLm(QtnyKmnIZ0tlMch}%CHMSix@mz L{an^LB{Ts5pX54_ literal 0 HcmV?d00001 diff --git a/assets/sprites/blocks/liquids/filter-pump.png b/assets/sprites/blocks/liquids/filter-pump.png new file mode 100644 index 0000000000000000000000000000000000000000..8bd6b2c23630aef464f40d61da51c8d11578060a GIT binary patch literal 546 zcmV+-0^R+IP)`|P3@kiA)R_q($_5NzxVUG>cEX>NDm8cZ{XSclvm>C{Fu8dH zfVe%=LjZt>+eg-~Z0BH`^-r#k005nCOHjY$;B-P2Msra{PJkY$N(7gKvV;lFSuz>| z0Q$W;8$Z8#0RVJQJ5J&{-Ifr(aAmp(1y|-Oq80)NfW<1-Joz!nXy_zDnyTFf=Mr;1 zZZ5UBJ^Ls^lL%LMhzP}$x+4_sBZ9J|KDZ3rM}$#8S-7tVSv0@~&z2doWmZZ=&DPrw zn@ua6{*M}wF~>Yjb3V$fUfy5nKyr--6$?!d9#ojcs>A z#{c;atO;1GVq--ESgUB)Sk#D^156V@2l$F8f^!T2kWY8dP(Ry58_*T5j514g!g-on z;VzxeT<)&cs#vRL`U zfzJ;Umt6q9SGm72VdJXFxWcF7f%y7RG>N#}ea$^@?QL3<>J80QU(@kG0OT!D4jVkg kxEz!vO@S)lTrPc~?+<(^b literal 0 HcmV?d00001 diff --git a/src/omaloon/content/blocks/OlDistributionBlocks.java b/src/omaloon/content/blocks/OlDistributionBlocks.java index 96b03258..d6f2a9d4 100644 --- a/src/omaloon/content/blocks/OlDistributionBlocks.java +++ b/src/omaloon/content/blocks/OlDistributionBlocks.java @@ -20,7 +20,7 @@ public class OlDistributionBlocks { tubeConveyor, tubeDistributor, tubeJunction, tubeSorter, tubeGate, tubeBridge, //liquid - liquidTube, liquidJunction, liquidBridge, liquidPump, liquidValve, liquidGauge, + liquidTube, liquidJunction, liquidBridge, liquidPump, filterPump, liquidValve, liquidGauge, end; @@ -145,6 +145,25 @@ public static void load() { }}; }}; + filterPump = new PressureLiquidPump("filter-pump") {{ + requirements(Category.liquid, with( + OlItems.cobalt, 4 + )); + researchCost = with( + OlItems.cobalt, 20 + ); + pumpStrength = 1f/6f; + pressureDifference = 1; + + configurable = true; + + ambientSound = Sounds.wind2; + ambientSoundVolume = 0.1f; + + pumpEffectIn = OlFx.pumpIn; + pumpEffectOut = OlFx.pumpOut; + }}; + liquidValve = new PressureLiquidValve("liquid-valve") {{ requirements(Category.liquid, with( OlItems.cobalt, 2, diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidPump.java b/src/omaloon/world/blocks/liquid/PressureLiquidPump.java index 47a7edf8..0d2f1084 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidPump.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidPump.java @@ -43,7 +43,7 @@ public class PressureLiquidPump extends Block { public TextureRegion[][] liquidRegions; public TextureRegion[] tiles; - public TextureRegion arrowRegion, topRegion, bottomRegion; + public TextureRegion arrowRegion, topRegion, bottomRegion, filterRegion; public PressureLiquidPump(String name) { super(name); @@ -51,7 +51,9 @@ public PressureLiquidPump(String name) { destructible = true; update = true; saveConfig = copyConfig = true; - config(Liquid.class, (PressureLiquidPumpBuild build, Liquid liquid) -> build.filter = liquid.id); + config(Liquid.class, (PressureLiquidPumpBuild build, Liquid liquid) -> { + build.filter = liquid == null ? -1 : liquid.id; + }); } @Override @@ -94,6 +96,7 @@ public void load() { tiles = OlUtils.split(name + "-tiles", 32, 0); arrowRegion = Core.atlas.find(name + "-arrow"); topRegion = Core.atlas.find(name + "-top"); + filterRegion = Core.atlas.find(name + "-filter"); bottomRegion = Core.atlas.find(name + "-bottom", "omaloon-liquid-bottom"); liquidRegions = new TextureRegion[2][animationFrames]; @@ -158,6 +161,11 @@ public int chainSize() { return pressure.section.builds.size; } + @Override + public Liquid config() { + return content.liquid(filter); + } + @Override public boolean connects(HasPressure to) { return HasPressure.super.connects(to) && (front() == to || back() == to) && (!(to instanceof PressureLiquidPumpBuild) || to.rotation() == rotation); } @@ -214,6 +222,11 @@ public void draw() { Draw.rect(arrowRegion, x, y, rotdeg()); } Draw.rect(tiles[tiling], x, y, rot); + if (filterRegion.found() && configurable && content.liquid(filter) != null) { + Draw.color(content.liquid(filter).color); + Draw.rect(filterRegion, x, y, rot); + Draw.color(); + } if (tiling == 0) Draw.rect(topRegion, x, y, rotdeg()); } @@ -300,17 +313,6 @@ public void updateTile() { 1 ); - if (effectTimer >= effectInterval && !Mathf.zero(maxFlow, 0.001f)) { - if (maxFlow < 0) { - if (back == null && !(back() instanceof PressureLiquidPumpBuild p && p.rotation == rotation)) pumpEffectOut.at(x, y, rotdeg() + 180f); - if (front == null && !(front() instanceof PressureLiquidPumpBuild p && p.rotation == rotation)) pumpEffectIn.at(x, y, rotdeg()); - } else { - if (back == null && !(back() instanceof PressureLiquidPumpBuild p && p.rotation == rotation)) pumpEffectIn.at(x, y, rotdeg() + 180f); - if (front == null && !(front() instanceof PressureLiquidPumpBuild p && p.rotation == rotation)) pumpEffectOut.at(x, y, rotdeg()); - } - effectTimer %= 1; - } - if (back != null) { pressure.pressure = back.pressure().getPressure(pumpLiquid); updatePressure(); @@ -327,6 +329,21 @@ public void updateTile() { Math.abs(maxFlow) ); + if (effectTimer >= effectInterval && !Mathf.zero(flow, 0.001f)) { + if (flow < 0) { + if (pumpLiquid == null || (front != null && front.pressure().get(pumpLiquid) > 0.001f)) { + if (back == null && !(back() instanceof PressureLiquidPumpBuild p && p.rotation == rotation)) pumpEffectOut.at(x, y, rotdeg() + 180f, pumpLiquid == null ? Color.white : pumpLiquid.color); + if (front == null && !(front() instanceof PressureLiquidPumpBuild p && p.rotation == rotation)) pumpEffectIn.at(x, y, rotdeg(), pumpLiquid == null ? Color.white : pumpLiquid.color); + } + } else { + if (pumpLiquid == null || (back != null && back.pressure().get(pumpLiquid) > 0.001f)) { + if (back == null && !(back() instanceof PressureLiquidPumpBuild p && p.rotation == rotation)) pumpEffectIn.at(x, y, rotdeg() + 180f, pumpLiquid == null ? Color.white : pumpLiquid.color); + if (front == null && !(front() instanceof PressureLiquidPumpBuild p && p.rotation == rotation)) pumpEffectOut.at(x, y, rotdeg(), pumpLiquid == null ? Color.white : pumpLiquid.color); + } + } + effectTimer %= 1; + } + functioning = !Mathf.zero(flow, 0.001f); if ( From d5d9fdb72fbad08276d732a64a636921674b6366 Mon Sep 17 00:00:00 2001 From: = Date: Wed, 22 Jan 2025 12:45:59 -0300 Subject: [PATCH 45/54] change settings to a proper place (cherry picked from commit 90bdf715c608a3319cefe73eeebb8f032a3089d0) --- assets/bundles/bundle.properties | 5 +- src/omaloon/OmaloonMod.java | 2 + src/omaloon/core/OlSettings.java | 39 ++++---- src/omaloon/ui/StartSplash.java | 4 +- .../ui/dialogs/OlDisclaimerDialog.java | 4 +- src/omaloon/ui/dialogs/OlGameDialog.java | 89 +++++++++++++++++++ src/omaloon/world/blocks/defense/Shelter.java | 4 +- 7 files changed, 123 insertions(+), 24 deletions(-) create mode 100644 src/omaloon/ui/dialogs/OlGameDialog.java diff --git a/assets/bundles/bundle.properties b/assets/bundles/bundle.properties index b3086382..b19a01d0 100644 --- a/assets/bundles/bundle.properties +++ b/assets/bundles/bundle.properties @@ -40,14 +40,15 @@ ui.omaloon-exit-dialog.mobile = [gray]Tap to exit ## settings settings.omaloon = Omaloon Settings +settings.omaloon-moddata = Omaloon Data + setting.omaloon-check-updates = Check for Updates setting.omaloon-shield-opacity = Shelter Opacity setting.omaloon-show-disclaimer = Hide Disclaimer setting.omaloon-discord-join = Join Omaloon discord server! -setting.omaloon-enable-soft-cleaner.name = Enable Safe Cleaner +setting.omaloon-enable-soft-cleaner = Enable Safe Cleaner setting.omaloon-enable-soft-cleaner.description = Cleans your campaign from not allowed content and research. -settings.omaloon-moddata = Omaloon Data binding.category-omaloon-editor = Editor settings.omaloon-resethints = Reset Hints diff --git a/src/omaloon/OmaloonMod.java b/src/omaloon/OmaloonMod.java index 8b1d3c58..8d7a0e9e 100644 --- a/src/omaloon/OmaloonMod.java +++ b/src/omaloon/OmaloonMod.java @@ -29,6 +29,7 @@ public class OmaloonMod extends Mod{ public static OlInputDialog olInputDialog; public static OlGameDataDialog olGameDataDialog; + public static OlGameDialog olGameDialog; public static OlEndDialog olEndDialog; /** @@ -93,6 +94,7 @@ public void init() { cliffFragment = new CliffFragment(); olInputDialog = new OlInputDialog(); olGameDataDialog = new OlGameDataDialog(); + olGameDialog = new OlGameDialog(); olEndDialog = new OlEndDialog(); Events.on(EventType.SectorCaptureEvent.class, e -> { if (e.sector.preset == OlSectorPresets.deadValley) olEndDialog.show(Core.scene, Actions.sequence( diff --git a/src/omaloon/core/OlSettings.java b/src/omaloon/core/OlSettings.java index b5917077..ce87ba50 100644 --- a/src/omaloon/core/OlSettings.java +++ b/src/omaloon/core/OlSettings.java @@ -18,8 +18,8 @@ public class OlSettings{ public static void load(){ //add omaloon settings ui.settings.addCategory("@settings.omaloon", OlIcons.settings, table -> { - if(!mobile || Core.settings.getBool("keyboard")) { - table.pref(new TableSetting("category", new Table(Tex.button, cat -> { + table.table(Tex.button, cat -> { + if(!mobile || Core.settings.getBool("keyboard")) { cat.button( "@settings.controls", Icon.move, @@ -27,20 +27,27 @@ public static void load(){ iconMed, () -> OmaloonMod.olInputDialog.show() ).growX().marginLeft(8f).height(50f).row(); - cat.button( - "@settings.omaloon-moddata", - Icon.save, - Styles.flatt, - iconMed, - () -> OmaloonMod.olGameDataDialog.show() - ).growX().marginLeft(8f).height(50f).row(); - }))); - } - table.sliderPref("@setting.omaloon-shield-opacity", 20, 0, 100, s -> s + "%"); - //checks - table.checkPref("@setting.omaloon-show-disclaimer", false); - table.checkPref("omaloon-enable-soft-cleaner", true); - table.checkPref("@setting.omaloon-check-updates", true); + } + cat.button( + "@settings.game", + Icon.settings, + Styles.flatt, + iconMed, + () -> OmaloonMod.olGameDialog.show() + ).growX().marginLeft(8f).height(50f).row(); + cat.button( + "@settings.omaloon-moddata", + Icon.save, + Styles.flatt, + iconMed, + () -> OmaloonMod.olGameDataDialog.show() + ).growX().marginLeft(8f).height(50f).row(); + }).width(Math.min(Core.graphics.getWidth() / 1.2f, 460.0F)).padBottom(45); +// table.sliderPref("@setting.omaloon-shield-opacity", 20, 0, 100, s -> s + "%"); +// //checks +// table.checkPref("@setting.omaloon-show-disclaimer", false); +// table.checkPref("omaloon-enable-soft-cleaner", true); +// table.checkPref("@setting.omaloon-check-updates", true); //discord link table.fill(c -> c diff --git a/src/omaloon/ui/StartSplash.java b/src/omaloon/ui/StartSplash.java index 6e96cc7b..c25f2c67 100644 --- a/src/omaloon/ui/StartSplash.java +++ b/src/omaloon/ui/StartSplash.java @@ -55,11 +55,11 @@ public static void show(){ } private static void onComplete() { - if (!settings.getBool("@setting.omaloon-show-disclaimer")) { + if (!settings.getBool("omaloon-show-disclaimer", false)) { new OlDisclaimerDialog().show(); } - if (settings.getBool("@setting.omaloon-check-updates")) { + if (settings.getBool("omaloon-check-updates", true)) { OlUpdateCheckerDialog.check(); } diff --git a/src/omaloon/ui/dialogs/OlDisclaimerDialog.java b/src/omaloon/ui/dialogs/OlDisclaimerDialog.java index 2651f1c3..821bfe5f 100644 --- a/src/omaloon/ui/dialogs/OlDisclaimerDialog.java +++ b/src/omaloon/ui/dialogs/OlDisclaimerDialog.java @@ -44,7 +44,7 @@ public OlDisclaimerDialog() { TextButton s = buttons.button("@button.omaloon-show-disclaimer", Icon.cancel, () -> { hide(); - Core.settings.put("@setting.omaloon-show-disclaimer", true); + Core.settings.put("omaloon-show-disclaimer", true); }).get(); s.setDisabled(() -> @@ -64,6 +64,6 @@ public OlDisclaimerDialog() { } boolean shouldSkip() { - return Core.settings.getBool("@setting.omaloon-show-disclaimer", false); + return Core.settings.getBool("omaloon-show-disclaimer", false); } } diff --git a/src/omaloon/ui/dialogs/OlGameDialog.java b/src/omaloon/ui/dialogs/OlGameDialog.java new file mode 100644 index 00000000..2ba85ac5 --- /dev/null +++ b/src/omaloon/ui/dialogs/OlGameDialog.java @@ -0,0 +1,89 @@ +package omaloon.ui.dialogs; + +import arc.*; +import arc.func.*; +import arc.scene.event.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import arc.struct.*; +import arc.util.*; +import mindustry.*; +import mindustry.ui.*; +import mindustry.ui.dialogs.*; + +public class OlGameDialog extends BaseDialog { + public final ObjectMap settings = new ObjectMap<>(); + + public OlGameDialog() { + super("@settings.game"); + + addCloseButton(); + + rebuild(); + } + + public void addCheck(String name, @Nullable String description, String setting, boolean def, Boolc cons) { + CheckBox box = new CheckBox(name); + box.update(() -> box.setChecked(Core.settings.getBool(setting, def))); + box.changed(() -> { + Core.settings.put(setting, box.isChecked()); + cons.get(box.isChecked()); + }); + box.left(); + cont.add(box).left().padTop(3f).get(); + if (description != null) Vars.ui.addDescTooltip(box, description); + settings.put(setting, def); + cont.row(); + } + + public void addSlider(String name, @Nullable String description, String setting, Slider slider, float def, Func sp) { + slider.setValue(Core.settings.getFloat(setting, def)); + Label value = new Label("", Styles.outlineLabel); + Table content = new Table(); + content.add(name, Styles.outlineLabel).left().growX().wrap(); + content.add(value).padLeft(10f).right(); + content.margin(3f, 33f, 3f, 33f); + content.touchable = Touchable.disabled; + slider.changed(() -> { + Core.settings.put(setting, slider.getValue()); + value.setText(sp.get(slider.getValue())); + }); + slider.change(); + Stack added = cont.stack(slider, content).width(Math.min(Core.graphics.getWidth() / 1.2f, 460f)).left().padTop(4f).get(); + if (description != null) Vars.ui.addDescTooltip(added, description); + settings.put(setting, def); + cont.row(); + } + + public void rebuild() { + cont.clear(); + + addSlider( + "@setting.omaloon-shield-opacity", null, "omaloon-shield-opacity", + new Slider(0, 100, 1, false), 20, + f -> Strings.autoFixed(f, 20) + "%" + ); + + addCheck( + "@setting.omaloon-show-disclaimer", null, "omaloon-show-disclaimer", + false, b -> {} + ); + addCheck( + "@setting.omaloon-enable-soft-cleaner", "@setting.omaloon-enable-soft-cleaner.description", "omaloon-enable-soft-cleaner", + true, b -> {} + ); + addCheck( + "@setting.omaloon-check-updates", null, "omaloon-check-updates", + true, b -> {} + ); + + cont.button("@settings.reset", () -> { + resetToDefaults(); + rebuild(); + }).size(250, 50); + } + + public void resetToDefaults() { + settings.each((name, value) -> Core.settings.put(name, value)); + } +} diff --git a/src/omaloon/world/blocks/defense/Shelter.java b/src/omaloon/world/blocks/defense/Shelter.java index 3026d8ec..2a4e98f6 100644 --- a/src/omaloon/world/blocks/defense/Shelter.java +++ b/src/omaloon/world/blocks/defense/Shelter.java @@ -67,7 +67,7 @@ public class Shelter extends Block { fieldBuffer.begin(Color.clear); buffer.each(Runnable::run); fieldBuffer.end(); - Draw.color(deflectColor, Vars.renderer.animateShields ? 1f : Core.settings.getInt("@setting.omaloon-shield-opacity", 20)/100f); + Draw.color(deflectColor, Vars.renderer.animateShields ? 1f : Core.settings.getFloat("omaloon-shield-opacity", 20f)/100f); EDraw.drawBuffer(fieldBuffer); Draw.flush(); Draw.color(); @@ -178,7 +178,7 @@ public void draw() { Draw.z(Layer.blockOver); float mousex = Core.input.mouseWorldX(), mousey = Core.input.mouseWorldY(); - Draw.color(Pal.accent, Interp.circle.apply(configureWarmup) * Core.settings.getInt("@setting.omaloon-shield-opacity", 20)/100f); + Draw.color(Pal.accent, Interp.circle.apply(configureWarmup) * Core.settings.getFloat("omaloon-shield-opacity", 20f)/100f); Fill.arc(x, y, shieldRange * Interp.circle.apply(configureWarmup), shieldAngle/360f, -shieldAngle/2f + Core.input.mouseWorld().angleTo(x, y) + 180f); for(int i = 0; i < configSerrations; i++) { From 619929a2434775af21b23b501cf1b521d2f00363 Mon Sep 17 00:00:00 2001 From: = Date: Tue, 28 Jan 2025 22:51:05 -0300 Subject: [PATCH 46/54] add setting for custom liquid stats --- assets/bundles/bundle.properties | 4 ++++ src/omaloon/content/OlLiquids.java | 15 ++++++++++++--- src/omaloon/ui/dialogs/OlGameDialog.java | 5 +++++ 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/assets/bundles/bundle.properties b/assets/bundles/bundle.properties index b19a01d0..9c4487cb 100644 --- a/assets/bundles/bundle.properties +++ b/assets/bundles/bundle.properties @@ -49,6 +49,9 @@ setting.omaloon-discord-join = Join Omaloon discord server! setting.omaloon-enable-soft-cleaner = Enable Safe Cleaner setting.omaloon-enable-soft-cleaner.description = Cleans your campaign from not allowed content and research. +setting.omaloon-display-liquid-stats = Display custom viscosity/density +setting.omaloon-display-liquid-stats.description = [red]NEEDS RELOAD + binding.category-omaloon-editor = Editor settings.omaloon-resethints = Reset Hints @@ -340,6 +343,7 @@ stat.omaloon-fluid-capacity = Fluid Capacity stat.omaloon-fluid-capacity.format = @x@x@ Blocks stat.omaloon-density = Density +stat.omaloon-viscosity = @%, \uC357 @ stat.omaloon-pump-strength = Pump Strength stat.omaloon-pressure-gradient = Pressure Gradient diff --git a/src/omaloon/content/OlLiquids.java b/src/omaloon/content/OlLiquids.java index 7cc040be..3a538d99 100644 --- a/src/omaloon/content/OlLiquids.java +++ b/src/omaloon/content/OlLiquids.java @@ -4,6 +4,7 @@ import arc.struct.*; import arc.util.*; import mindustry.content.*; +import mindustry.game.*; import mindustry.type.*; import mindustry.world.meta.*; import omaloon.type.liquid.*; @@ -56,17 +57,25 @@ public static void load(){ addViscosity(glacium, 13); addDensity(tiredGlacium, 1300); addViscosity(tiredGlacium, 13); + + if (Core.settings.getBool("omaloon-display-liquid-stats", true)) Events.on(EventType.ContentInitEvent.class, e -> { + densities.each(map -> { + map.key.stats.add(OlStats.density, map.value, OlStats.densityUnit); + }); + viscosities.each(map -> { + map.key.checkStats(); + map.key.stats.remove(Stat.viscosity); + map.key.stats.add(Stat.viscosity, Core.bundle.get("stat.omaloon-viscosity"), map.key.viscosity * 100f ,Strings.autoFixed(map.value/60f, 2) + " " + OlStats.viscosityUnit.localized()); + }); + }); } public static void addDensity(Liquid liquid, float density) { densities.put(liquid, density); - liquid.stats.add(OlStats.density, density, OlStats.densityUnit); } public static void addViscosity(Liquid liquid, float viscosity) { viscosities.put(liquid, viscosity); - liquid.stats.remove(Stat.viscosity); - liquid.stats.add(Stat.viscosity, Strings.autoFixed(viscosity/60f, 2), OlStats.viscosityUnit); } public static float getDensity(@Nullable Liquid liquid) { diff --git a/src/omaloon/ui/dialogs/OlGameDialog.java b/src/omaloon/ui/dialogs/OlGameDialog.java index 2ba85ac5..871efbda 100644 --- a/src/omaloon/ui/dialogs/OlGameDialog.java +++ b/src/omaloon/ui/dialogs/OlGameDialog.java @@ -77,6 +77,11 @@ public void rebuild() { true, b -> {} ); + addCheck( + "@setting.omaloon-display-liquid-stats", "@setting.omaloon-display-liquid-stats.description", "omaloon-display-liquid-stats", + true, b -> {} + ); + cont.button("@settings.reset", () -> { resetToDefaults(); rebuild(); From 221e21471bf0127da89236d66cb899270de636e9 Mon Sep 17 00:00:00 2001 From: = Date: Wed, 29 Jan 2025 12:59:01 -0300 Subject: [PATCH 47/54] demo boiler block, it has issues though --- .../blocks/crafting/air-well-cap-from.png | Bin 293 -> 0 bytes .../blocks/crafting/air-well-cap-to.png | Bin 296 -> 0 bytes .../blocks/crafting/air-well-overlay.png | Bin 275 -> 0 bytes assets/sprites/blocks/crafting/air-well.png | Bin 479 -> 0 bytes .../blocks/crafting/glacium-boiler.png | Bin 0 -> 1102 bytes .../content/blocks/OlCraftingBlocks.java | 21 ++++++- .../content/blocks/OlDistributionBlocks.java | 2 +- .../blocks/production/PressureCrafter.java | 58 ++++++++++++++++++ src/omaloon/world/consumers/ConsumeFluid.java | 1 + 9 files changed, 80 insertions(+), 2 deletions(-) delete mode 100644 assets/sprites/blocks/crafting/air-well-cap-from.png delete mode 100644 assets/sprites/blocks/crafting/air-well-cap-to.png delete mode 100644 assets/sprites/blocks/crafting/air-well-overlay.png delete mode 100644 assets/sprites/blocks/crafting/air-well.png create mode 100644 assets/sprites/blocks/crafting/glacium-boiler.png diff --git a/assets/sprites/blocks/crafting/air-well-cap-from.png b/assets/sprites/blocks/crafting/air-well-cap-from.png deleted file mode 100644 index 3607131eded34ffe0718b648f5a381eed0644eef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 293 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND0tn| z#W5tJ_3cz$zC#WoE$n(uRh?2QvlI+H4oP}kP?^&RWHq@ZRdxFM2Zc-y`j(#NE&6`) z?#bt-r+wE=kobSjg;PI#x7xPvJgeZ!m$F(j zh6h>g;h`(#uFU6PyY*?>MwLCY|9;wcWRH&hwcsSf&L@&Dg3ffUFJic7D&~3Ms@{(2 z+KQY#jhrXi4P4HNPGxlxT6p`Q1HTg6{SBw2T=q|rFzIUddcz<6%5{m;sv}jK7tBw# nI^m`9bP|K|!fDcNj12j69TV@J{20C%=tTxkS3j3^P6|;&^`NRUr1tC8D!sRwzS|Dj3Vm@gi;jcNrs%S_)IFrj)q$_oHJyLRNz;P z`s{InDS0wW%yfgc=bgL!7I-Utv(j1OcI3jbP0l+XkKuw8L$ diff --git a/assets/sprites/blocks/crafting/air-well-overlay.png b/assets/sprites/blocks/crafting/air-well-overlay.png deleted file mode 100644 index 63b7d6d51e5e68d4534b9c34a8f548b8ea4dfd9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND0tM< z#W5tJ_3iYHyoU?~T<70anxdua9FWE%mMA8c*fT}4$t*NwY1^p+Gd|8q{+aKte*2q# zvvq&%nuG57=H^Ek~6=;Gkvo#V}r&-{S}H6&z~^Gs5XTLP5#yq)E5d}&Gq7yHGYEh^X2RIchwzpx@LamK{fAFHL^ID50y_$5^1e%nrL UF0>ST3-l0!r>mdKI;Vst0N!tGjQ{`u diff --git a/assets/sprites/blocks/crafting/air-well.png b/assets/sprites/blocks/crafting/air-well.png deleted file mode 100644 index 6baf3053916180f1a975bf1d472fbedcafbb1619..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 479 zcmV<50U-W~P)Bw(q!BQa44v9MH~5JN@RZhS&N zqJO~(Kf%IMKBDT9L~7NMfh7#c!Ex+MD&-Ca-gxo(y*r;BJDH5e#nH(zICh&Yrn5OL ztkx@aeb676d!C;bkURk3(k#brv#pTRhOR)qI8P}607!&1utaDlwN5X6NRH(C;<5mM z^Rv_1=BwL>Mgj{wOz*ERweJ)T*M?j=+=pEA1^nEEYeT+|2+PJ2k=)%s76%{eM)Iz} z!!e!BzeDhO*pEWaIVjB?eIOArz-x^2*hN7_z}s>eoKU87?FK@M&}xYqf)FCCLe{$( z4ug^UK=q=$0TL3EydvPY@Gqbg5c3i8jOfLF{ZfP)f)E*D{ibUILZ+i8q9PzhEs!Gq zP8RU4C^UGd>^QmBy><=aAQ8!AG%lo(uQh8*Ti-j<4(QS>Z)Mnq+-GCW2IXYbv|*ou zC2f6!NjVt-`ha3JtMaNXf!5=$OhyEG6K%<@HO)tw<=_KxtqzcgF57hS#Scg#z5u%z V!)v0F=^p?9002ovPDHLkV1ip*&!YeU diff --git a/assets/sprites/blocks/crafting/glacium-boiler.png b/assets/sprites/blocks/crafting/glacium-boiler.png new file mode 100644 index 0000000000000000000000000000000000000000..363b4c312d40a5975e74d8aa8961913ac0f9dc7d GIT binary patch literal 1102 zcmV-U1hM;xP)Px(2uVaiRCt{2TfJ%-X_-*h{DtQnZ19vxUJgX zit)O6f!*saROoxc7yuwAVfVWGF9|8>HBLXUC3s1QHqi*#oL)x)7PBea(SjNzL?};P zyU+;0PBIDLoaf!*R(v>xo6D=#HOWbr#-o|QlO-TMfcxDSJY&m=8s|485%0M|Dvd@m9} z#RcAhcu3In(UQRV3zC3H+Fz2I?{R|$&@T1Y!}F{QzX<-UMst#qYES|x@w&(wREVyYA47kmZPgB)Kb0#(=MPTL7QH)+|yc*H4afP zfgIc{=T206sFIK?&#iY!`A$n9M~NW3gG3}%@XVJyzBd9Lef|EkWdWL*vnc1a1k3iR z@h|F}U^G0I5c$HE!&wLzGCm0CdjNgogMhvV&^OLPfM**#*Xyhz}>Fx8JbN_U9{ zOW7YP8q@?rR6mymltN)lN<=8EO}cthaOU>{(y@5ctYAJ{vdWhNqf(z_3DUWLd)S*p zVv_}Ea{?aarF&YRV6_A_0TBriPlh>%c6Kc!kjG(7UXXHvU6s$lSrMh6CNHRRg4(1g zZWpP%)CXIFHYrNAJ0ZZD7EkRtyF`LDEsooh`2Y_nlf?>X3C4s` z1XnMRumYPbHG3LMpxS61um>Umi`n$}Cn1qgW57wK^lBd9U#Xm_P?7>xT0=t3*~(>? zNWj-563jJ15(%F7i&{`gS50+jc#TjWB$Q+(5~P_9uMt|zrtDrlpDk71oRaI^Jv``C zDQY?GY2PYY+jgyJ>s%?S8GuD0OP`2xzK}S88;D1FP2Z^3Zk;PdIdoAzQbx5((f5QB z2`vIV%J)%TAN5_s2?0_jr&K4{7fR!?WR}>k#;6CCe)k2>*i2uId1rmotkkJ<+>Zj+ zk1OkymNfg-n0JOf36NScDIHW_jSWfpuCloT@759+!n&>jYH}ynlX@Ra3>}Gtzm*G} U@WKS}kN^Mx07*qoM6N<$f*%|1kpKVy literal 0 HcmV?d00001 diff --git a/src/omaloon/content/blocks/OlCraftingBlocks.java b/src/omaloon/content/blocks/OlCraftingBlocks.java index 56f049ac..caf4323d 100644 --- a/src/omaloon/content/blocks/OlCraftingBlocks.java +++ b/src/omaloon/content/blocks/OlCraftingBlocks.java @@ -3,6 +3,7 @@ import mindustry.content.*; import mindustry.type.*; import mindustry.world.*; +import mindustry.world.meta.*; import omaloon.content.*; import omaloon.world.blocks.production.*; import omaloon.world.consumers.*; @@ -10,7 +11,7 @@ import static mindustry.type.ItemStack.*; public class OlCraftingBlocks { - public static Block carborundumPress, graphitePress; + public static Block carborundumPress, graphitePress, glaciumBoiler; public static void load() { carborundumPress = new PressureCrafter("carborundum-press") {{ @@ -67,5 +68,23 @@ public static void load() { outputItem = new ItemStack(Items.graphite, 2); }}; + + glaciumBoiler = new PressureCrafter("glacium-boiler") {{ + requirements(Category.crafting, BuildVisibility.sandboxOnly, with()); + size = 2; + + useVanillaLiquids = false; + ignoreLiquidFullness = true; + dumpExtraLiquid = true; + + craftTime = 120f; + + consumeItem(Items.coal, 1); + consume(new ConsumeFluid(OlLiquids.glacium, 1f/60f) {{ + continuous = true; + }}); + + outputAir = 4f/6f; + }}; } } diff --git a/src/omaloon/content/blocks/OlDistributionBlocks.java b/src/omaloon/content/blocks/OlDistributionBlocks.java index d6f2a9d4..f76086aa 100644 --- a/src/omaloon/content/blocks/OlDistributionBlocks.java +++ b/src/omaloon/content/blocks/OlDistributionBlocks.java @@ -153,7 +153,7 @@ public static void load() { OlItems.cobalt, 20 ); pumpStrength = 1f/6f; - pressureDifference = 1; + pressureDifference = 0; configurable = true; diff --git a/src/omaloon/world/blocks/production/PressureCrafter.java b/src/omaloon/world/blocks/production/PressureCrafter.java index 9ea63132..c4b5166e 100644 --- a/src/omaloon/world/blocks/production/PressureCrafter.java +++ b/src/omaloon/world/blocks/production/PressureCrafter.java @@ -1,8 +1,11 @@ package omaloon.world.blocks.production; +import arc.util.*; import arc.util.io.*; +import mindustry.type.*; import mindustry.world.blocks.production.*; import mindustry.world.consumers.*; +import mindustry.world.meta.*; import omaloon.world.interfaces.*; import omaloon.world.meta.*; import omaloon.world.modules.*; @@ -12,11 +15,34 @@ public class PressureCrafter extends GenericCrafter { public boolean useConsumerMultiplier = true; + /** + * Set this to false every time you want the outputs to use the pressure liquid system instead. + * Alternatively, creating ConsumeFluids with negative values for it's amount will work too. + */ + public boolean useVanillaLiquids = true; + + /** + * Internal variable used to output pressurized liquids, Do not modify manually. + */ + private @Nullable LiquidStack[] outputPressurizedLiquids; + + public float outputAir; + public PressureCrafter(String name) { super(name); pressureConfig.isWhitelist = true; } + @Override + public void init() { + if (!useVanillaLiquids) { + outputPressurizedLiquids = outputLiquids; + outputLiquids = null; + } + + super.init(); + } + @Override public void setBars() { super.setBars(); @@ -27,6 +53,13 @@ public void setBars() { public void setStats() { super.setStats(); pressureConfig.addStats(stats); + + if(outputPressurizedLiquids != null) { + stats.add(Stat.output, StatValues.liquids(1f, outputPressurizedLiquids)); + } + if (outputAir > 0) { + stats.add(OlStats.addFluid, OlStats.fluid(null, outputAir, 1f, true)); + } } public class PressureCrafterBuild extends GenericCrafterBuild implements HasPressure { @@ -69,9 +102,34 @@ public void read(Reads read, byte revision) { pressure.read(read); } + @Override + public boolean shouldConsume() { + if(outputPressurizedLiquids != null && !ignoreLiquidFullness) { + boolean allFull = true; + if (pressure.get(null) >= pressureConfig.fluidCapacity - 0.001f) { + if (!dumpExtraLiquid) return false; + } else allFull = false; + for(var output : outputPressurizedLiquids) { + if(pressure.get(output.liquid) >= pressureConfig.fluidCapacity - 0.001f) { + if(!dumpExtraLiquid) return false; + } else allFull = false; + } + + //if there is no space left for any liquid, it can't reproduce + if(allFull) return false; + } + return super.shouldConsume(); + } + @Override public void updateTile() { super.updateTile(); + if(efficiency > 0) { + float inc = getProgressIncrease(1f); + if (outputPressurizedLiquids != null) for(var output : outputPressurizedLiquids) addFluid(output.liquid, output.amount * inc); + if (outputAir > 0) addFluid(null, outputAir * inc); + } + updatePressure(); } diff --git a/src/omaloon/world/consumers/ConsumeFluid.java b/src/omaloon/world/consumers/ConsumeFluid.java index 7a559869..6b4acf9f 100644 --- a/src/omaloon/world/consumers/ConsumeFluid.java +++ b/src/omaloon/world/consumers/ConsumeFluid.java @@ -91,6 +91,7 @@ public float efficiencyMultiplier(Building build) { } public boolean shouldConsume(HasPressure build) { + if (fluid != null && amount > 0 && build.pressure().get(fluid) <= amount) return false; if (startRange == endRange) return true; return startRange <= build.pressure().getPressure(fluid) && build.pressure().getPressure(fluid) <= endRange && (fluid == null || build.pressure().liquids[fluid.id] > amount); } From a8fb06ce0d797b73754a9fb446d548781dd92720 Mon Sep 17 00:00:00 2001 From: = Date: Thu, 30 Jan 2025 20:13:55 -0300 Subject: [PATCH 48/54] how tf was this it working --- .../world/blocks/sandbox/PressureLiquidSource.java | 10 +++++++--- src/omaloon/world/meta/PressureSection.java | 4 ++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/omaloon/world/blocks/sandbox/PressureLiquidSource.java b/src/omaloon/world/blocks/sandbox/PressureLiquidSource.java index dffd66ae..1ec863e6 100644 --- a/src/omaloon/world/blocks/sandbox/PressureLiquidSource.java +++ b/src/omaloon/world/blocks/sandbox/PressureLiquidSource.java @@ -17,6 +17,7 @@ import mindustry.ui.*; import mindustry.world.*; import mindustry.world.blocks.liquid.*; +import omaloon.content.*; import omaloon.ui.elements.*; import omaloon.world.interfaces.*; import omaloon.world.meta.*; @@ -188,9 +189,12 @@ public void read(Reads read, byte revision) { public void updateTile() { pressure.section.updateTransfer(); - float difference = (Vars.content.liquid(liquid) == null ? targetAmount : Mathf.maxZero(targetAmount)) - (Vars.content.liquid(liquid) == null ? pressure.air : pressure.liquids[liquid]); - - addFluid(Vars.content.liquid(liquid), difference); + pressure.air = Vars.content.liquid(liquid) == null ? targetAmount : 0; + pressure.pressure = pressure.air / pressureConfig.fluidCapacity * OlLiquids.getDensity(null); + Vars.content.liquids().each(liq -> { + pressure.liquids[liq.id] = liq.id == liquid ? Mathf.maxZero(targetAmount) : 0; + pressure.pressures[liq.id] = pressure.liquids[liq.id] / pressureConfig.fluidCapacity * OlLiquids.getDensity(liq); + }); } @Override diff --git a/src/omaloon/world/meta/PressureSection.java b/src/omaloon/world/meta/PressureSection.java index dfbbdda9..d77201d2 100644 --- a/src/omaloon/world/meta/PressureSection.java +++ b/src/omaloon/world/meta/PressureSection.java @@ -137,7 +137,7 @@ public void updateTransfer() { entry.value.pressureConfig().fluidCapacity, entry.key.pressureConfig().fluidCapacity, OlLiquids.getDensity(main), - 0 + 1 ) / (2f * links.size); float flow = Mathf.clamp( @@ -186,7 +186,7 @@ public void updateTransfer() { entry.value.pressureConfig().fluidCapacity, entry.key.pressureConfig().fluidCapacity, OlLiquids.getDensity(null), - 0 + 1 ) / (2f * links.size); float flow = Mathf.clamp( From 54b72d9befefbb1f00cf3a77123a6016b4acfebc Mon Sep 17 00:00:00 2001 From: = Date: Thu, 30 Jan 2025 22:13:05 -0300 Subject: [PATCH 49/54] light stat change --- assets/bundles/bundle.properties | 2 +- .../world/blocks/liquid/PressureLiquidPump.java | 2 +- src/omaloon/world/consumers/ConsumeFluid.java | 14 ++++++++++++-- src/omaloon/world/meta/OlStats.java | 15 +++++++++++++-- src/omaloon/world/meta/PressureConfig.java | 4 ++-- 5 files changed, 29 insertions(+), 8 deletions(-) diff --git a/assets/bundles/bundle.properties b/assets/bundles/bundle.properties index 9c4487cb..d508b160 100644 --- a/assets/bundles/bundle.properties +++ b/assets/bundles/bundle.properties @@ -353,7 +353,7 @@ stat.omaloon-max-pressure = Max Pressure stat.omaloon-pressureflow = Speed stat.omaloon-pressure-range = Operating Range -stat.omaloon-pressure-range.format = between \uC357 @ Pascals and \uC357 @ Pascals. +stat.omaloon-pressure-range.format = Between \uC357 @ Pascals and \uC357 @ Pascals. stat.omaloon-optimal-pressure = Optimal Pressure stat.omaloon-optimal-pressure.format = \uC357 @ Pascals (@%) diff --git a/src/omaloon/world/blocks/liquid/PressureLiquidPump.java b/src/omaloon/world/blocks/liquid/PressureLiquidPump.java index 0d2f1084..0f055cce 100644 --- a/src/omaloon/world/blocks/liquid/PressureLiquidPump.java +++ b/src/omaloon/world/blocks/liquid/PressureLiquidPump.java @@ -126,7 +126,7 @@ public void setStats() { pressureConfig.addStats(stats); stats.remove(OlStats.fluidCapacity); stats.add(OlStats.pumpStrength, pumpStrength * 60f, StatUnit.liquidSecond); - stats.add(OlStats.pressureGradient, pressureDifference, OlStats.pressureUnit); + stats.add(OlStats.pressureGradient, OlStats.pressure(pressureDifference, true)); } public class PressureLiquidPumpBuild extends Building implements HasPressure { diff --git a/src/omaloon/world/consumers/ConsumeFluid.java b/src/omaloon/world/consumers/ConsumeFluid.java index 6b4acf9f..8fae3ab0 100644 --- a/src/omaloon/world/consumers/ConsumeFluid.java +++ b/src/omaloon/world/consumers/ConsumeFluid.java @@ -73,8 +73,18 @@ public void display(Stats stats) { } if (startRange != endRange) { - stats.add(OlStats.pressureRange, Core.bundle.get("stat.omaloon-pressure-range.format"), Strings.autoFixed(startRange, 2), Strings.autoFixed(endRange, 2)); - if (hasOptimalPressure) stats.add(OlStats.optimalPressure, Core.bundle.get("stat.omaloon-optimal-pressure.format"), Strings.autoFixed(optimalPressure, 2), Strings.autoFixed(efficiencyMultiplier * 100f, 2)); + stats.add( + OlStats.pressureRange, + Core.bundle.get("stat.omaloon-pressure-range.format"), + (startRange == 0 ? "" : (startRange > 0 ? "+" : "-")) + Strings.autoFixed(Math.abs(startRange), 2), + (endRange == 0 ? "" : (endRange > 0 ? "+" : "-")) + Strings.autoFixed(Math.abs(endRange), 2) + ); + if (hasOptimalPressure) stats.add( + OlStats.optimalPressure, + Core.bundle.get("stat.omaloon-optimal-pressure.format"), + (optimalPressure == 0 ? "" : (optimalPressure > 0 ? "+" : "-")) + Strings.autoFixed(Math.abs(optimalPressure), 2), + Strings.autoFixed(efficiencyMultiplier * 100f, 2) + ); } } diff --git a/src/omaloon/world/meta/OlStats.java b/src/omaloon/world/meta/OlStats.java index 6b173779..9c2c2ace 100644 --- a/src/omaloon/world/meta/OlStats.java +++ b/src/omaloon/world/meta/OlStats.java @@ -37,8 +37,6 @@ public class OlStats { optimalPressure = new Stat("omaloon-optimal-pressure", pressure); public static final StatUnit - blocksCubed = new StatUnit("omaloon-blocks-cubed"), - densityUnit = new StatUnit("omaloon-density-unit", "\uC357"), viscosityUnit = new StatUnit("omaloon-viscosity-unit", "\uC357"), @@ -66,4 +64,17 @@ public static StatValue fluid(@Nullable Liquid liquid, float amount, float time, }); }; } + + public static StatValue pressure(float amount, boolean merge) { + return table -> { + String l1 = (pressureUnit.icon == null ? "" : pressureUnit.icon + " ") + (amount == 0 ? "" : (amount > 0 ? "+" : "-")) + Strings.autoFixed(Math.abs(amount), 2), l2 = (pressureUnit.space ? " " : "") + pressureUnit.localized(); + + if(merge){ + table.add(l1 + l2).left(); + }else{ + table.add(l1).left(); + table.add(l2).left(); + } + }; + } } diff --git a/src/omaloon/world/meta/PressureConfig.java b/src/omaloon/world/meta/PressureConfig.java index e95753d4..7cff4ee8 100644 --- a/src/omaloon/world/meta/PressureConfig.java +++ b/src/omaloon/world/meta/PressureConfig.java @@ -80,8 +80,8 @@ public class PressureConfig { public void addStats(Stats stats) { stats.add(OlStats.fluidCapacity, Core.bundle.get("stat.omaloon-fluid-capacity.format"), fluidCapacity/8f, fluidCapacity/8f, fluidCapacity/8f); - stats.add(OlStats.maxPressure, maxPressure, OlStats.pressureUnit); - stats.add(OlStats.minPressure, minPressure, OlStats.pressureUnit); + stats.add(OlStats.maxPressure, OlStats.pressure(maxPressure, true)); + stats.add(OlStats.minPressure, OlStats.pressure(minPressure, true)); } public void addBars(Block block) { From 7eb28cd18aeca12a95df55c1b0c54d485c9fbb8d Mon Sep 17 00:00:00 2001 From: = Date: Fri, 31 Jan 2025 01:04:35 -0300 Subject: [PATCH 50/54] techtree and change the gauge cost --- src/omaloon/content/OlTechTree.java | 12 ++++++------ .../content/blocks/OlDistributionBlocks.java | 15 ++++++++------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/omaloon/content/OlTechTree.java b/src/omaloon/content/OlTechTree.java index 77d4736d..5f5ca348 100644 --- a/src/omaloon/content/OlTechTree.java +++ b/src/omaloon/content/OlTechTree.java @@ -33,13 +33,13 @@ public static void load() { }); node(hammerDrill, () -> { - node(liquidTube, () -> { - node(liquidJunction, () -> { - node(liquidBridge); - }); - node(liquidPump, () -> { - node(liquidValve); + node(liquidPump, () -> { + node(liquidTube, () -> { + node(liquidJunction, () -> { + node(liquidBridge); + }); }); + node(liquidGauge); }); node(carborundumPress, with(new Research(smallShelter)), () -> { diff --git a/src/omaloon/content/blocks/OlDistributionBlocks.java b/src/omaloon/content/blocks/OlDistributionBlocks.java index f76086aa..c27bca91 100644 --- a/src/omaloon/content/blocks/OlDistributionBlocks.java +++ b/src/omaloon/content/blocks/OlDistributionBlocks.java @@ -7,6 +7,7 @@ import mindustry.type.*; import mindustry.world.*; import mindustry.world.draw.*; +import mindustry.world.meta.*; import omaloon.content.*; import omaloon.world.blocks.distribution.*; import omaloon.world.blocks.liquid.*; @@ -105,7 +106,7 @@ public static void load() { OlItems.cobalt, 2 )); researchCost = with( - OlItems.cobalt, 15 + OlItems.cobalt, 10 ); }}; @@ -129,7 +130,7 @@ public static void load() { OlItems.cobalt, 4 )); researchCost = with( - OlItems.cobalt, 20 + OlItems.cobalt, 25 ); pumpStrength = 5f/60f; @@ -140,8 +141,8 @@ public static void load() { pumpEffectOut = OlFx.pumpOut; pressureConfig = new PressureConfig() {{ - minPressure = -25f; - maxPressure = 25f; +// minPressure = -25f; +// maxPressure = 25f; }}; }}; @@ -165,7 +166,7 @@ public static void load() { }}; liquidValve = new PressureLiquidValve("liquid-valve") {{ - requirements(Category.liquid, with( + requirements(Category.liquid, BuildVisibility.sandboxOnly, with( OlItems.cobalt, 2, Items.beryllium, 2 )); @@ -182,11 +183,11 @@ public static void load() { liquidGauge = new PressureLiquidGauge("liquid-gauge") {{ requirements(Category.liquid, with( OlItems.cobalt, 2, - OlItems.carborundum, 1 + Items.beryllium, 1 )); researchCost = with( OlItems.cobalt, 20, - OlItems.carborundum, 10 + Items.beryllium, 10 ); }}; //endregion From ad6f120f629f5156303f388ce87068cdb6f70ed4 Mon Sep 17 00:00:00 2001 From: = Date: Fri, 31 Jan 2025 12:31:11 -0300 Subject: [PATCH 51/54] slight density change --- src/omaloon/content/OlLiquids.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/omaloon/content/OlLiquids.java b/src/omaloon/content/OlLiquids.java index 3a538d99..4574f738 100644 --- a/src/omaloon/content/OlLiquids.java +++ b/src/omaloon/content/OlLiquids.java @@ -79,7 +79,7 @@ public static void addViscosity(Liquid liquid, float viscosity) { } public static float getDensity(@Nullable Liquid liquid) { - return densities.get(liquid, 1f); + return densities.get(liquid, 5f); } public static float getViscosity(@Nullable Liquid liquid) { From e402dc7731ce2d9107d69e1ccdc65b1656414bdc Mon Sep 17 00:00:00 2001 From: = Date: Fri, 31 Jan 2025 18:00:58 -0300 Subject: [PATCH 52/54] hints --- assets/bundles/bundle.properties | 4 +++- src/omaloon/ui/dialogs/EventHints.java | 17 +++++++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/assets/bundles/bundle.properties b/assets/bundles/bundle.properties index d508b160..9b0c9807 100644 --- a/assets/bundles/bundle.properties +++ b/assets/bundles/bundle.properties @@ -65,8 +65,10 @@ omaloon.update.dialog.fullclean.confirm = Are you sure you want to reset your cu requirement.omaloon-at-wave = Reach Wave {0} in {1} ## Hints +hint.omaloon-air = Air is equivalent to pressure in it's density. So each fluid unit of air equals one pascal inside the Liquid Tube. +hint.omaloon-drill = Drills work with negative pressure, working faster with lower pressures. hint.omaloon-pump_chaining = Pumps chained in series can reach a higher pressure gradient between the ends. If they're chained in parallel, they work faster. -hint.omaloon-pump_max_min_pressure = Pumps can only pump out so much before the pressure starts damaging them. +hint.omaloon-shelter = Shelters work with positive pressure, covering a larger area at higher pressures. ## planets planet.omaloon-omaloon.name = Omaloon diff --git a/src/omaloon/ui/dialogs/EventHints.java b/src/omaloon/ui/dialogs/EventHints.java index 09ec93f5..880df303 100644 --- a/src/omaloon/ui/dialogs/EventHints.java +++ b/src/omaloon/ui/dialogs/EventHints.java @@ -6,18 +6,27 @@ import arc.util.*; import mindustry.*; import mindustry.ui.fragments.HintsFragment.*; +import omaloon.world.blocks.defense.Shelter.*; import omaloon.world.blocks.liquid.*; +import omaloon.world.blocks.production.PressureDrill.*; +import omaloon.world.interfaces.*; public enum EventHints implements Hint { + air( + () -> false, + () -> Vars.state.rules.defaultTeam.data().buildings.contains(b -> b instanceof HasPressure) + ), + drill( + () -> false, + () -> Vars.state.rules.defaultTeam.data().buildings.contains(b -> b instanceof PressureDrillBuild) + ), pump_chaining( () -> false, () -> Vars.control.input.block instanceof PressureLiquidPump ), - pump_max_min_pressure( + shelter( () -> false, - () -> - Vars.state.rules.defaultTeam.data().buildings.contains(b -> b instanceof PressureLiquidPump.PressureLiquidPumpBuild) && - Vars.control.input.block instanceof PressureLiquidPump + () -> Vars.state.rules.defaultTeam.data().buildings.contains(b -> b instanceof ShelterBuild) ); final Boolp complete; From 2112f2ff15962c5c706a019a328067275f5d1878 Mon Sep 17 00:00:00 2001 From: = Date: Sun, 2 Feb 2025 20:55:25 -0300 Subject: [PATCH 53/54] funni stat changes --- assets/bundles/bundle.properties | 16 +++++++--------- src/omaloon/content/OlLiquids.java | 2 +- .../world/blocks/production/PressureCrafter.java | 2 +- src/omaloon/world/consumers/ConsumeFluid.java | 4 ++-- src/omaloon/world/meta/OlStats.java | 5 ++--- src/omaloon/world/meta/PressureConfig.java | 4 ++-- 6 files changed, 15 insertions(+), 18 deletions(-) diff --git a/assets/bundles/bundle.properties b/assets/bundles/bundle.properties index 9b0c9807..88be8de2 100644 --- a/assets/bundles/bundle.properties +++ b/assets/bundles/bundle.properties @@ -337,15 +337,13 @@ category.omaloon-pressure = Pressure stat.omaloon-max-speed = Max Speed stat.omaloon-min-speed = Min Speed -stat.omaloon-add-fluid = Add Fluid air = Air -stat.omaloon-remove-fluid = Remove Fluid stat.omaloon-fluid-capacity = Fluid Capacity stat.omaloon-fluid-capacity.format = @x@x@ Blocks stat.omaloon-density = Density -stat.omaloon-viscosity = @%, \uC357 @ +stat.omaloon-viscosity = @% (\uC357 @) stat.omaloon-pump-strength = Pump Strength stat.omaloon-pressure-gradient = Pressure Gradient @@ -355,18 +353,18 @@ stat.omaloon-max-pressure = Max Pressure stat.omaloon-pressureflow = Speed stat.omaloon-pressure-range = Operating Range -stat.omaloon-pressure-range.format = Between \uC357 @ Pascals and \uC357 @ Pascals. +stat.omaloon-pressure-range.format = \uC357 @ to @ Pressure Units. stat.omaloon-optimal-pressure = Optimal Pressure -stat.omaloon-optimal-pressure.format = \uC357 @ Pascals (@%) +stat.omaloon-optimal-pressure.format = \uC357 @ Pressure Units (@%) ## ui units unit.omaloon-blocks-cubed = Blocks\u00B3 -unit.omaloon-density-unit = Pascals/Blocks\u00B3 -unit.omaloon-viscosity-unit = Pascal Seconds +unit.omaloon-density-unit = Pressure Units / Blocks\u00B3 +unit.omaloon-viscosity-unit = Viscosity Units -unit.omaloon-pressure-unit = Pascals -unit.omaloon-pressure-second = Pascals/Second +unit.omaloon-pressure-unit = Pressure Units +unit.omaloon-pressure-second = Pressure Units / Second bar.air = Air: diff --git a/src/omaloon/content/OlLiquids.java b/src/omaloon/content/OlLiquids.java index 4574f738..b53fe848 100644 --- a/src/omaloon/content/OlLiquids.java +++ b/src/omaloon/content/OlLiquids.java @@ -79,7 +79,7 @@ public static void addViscosity(Liquid liquid, float viscosity) { } public static float getDensity(@Nullable Liquid liquid) { - return densities.get(liquid, 5f); + return densities.get(liquid, 8f); } public static float getViscosity(@Nullable Liquid liquid) { diff --git a/src/omaloon/world/blocks/production/PressureCrafter.java b/src/omaloon/world/blocks/production/PressureCrafter.java index c4b5166e..29a6fe78 100644 --- a/src/omaloon/world/blocks/production/PressureCrafter.java +++ b/src/omaloon/world/blocks/production/PressureCrafter.java @@ -58,7 +58,7 @@ public void setStats() { stats.add(Stat.output, StatValues.liquids(1f, outputPressurizedLiquids)); } if (outputAir > 0) { - stats.add(OlStats.addFluid, OlStats.fluid(null, outputAir, 1f, true)); + stats.add(Stat.output, OlStats.fluid(null, outputAir, 1f, true)); } } diff --git a/src/omaloon/world/consumers/ConsumeFluid.java b/src/omaloon/world/consumers/ConsumeFluid.java index 8fae3ab0..78347d5a 100644 --- a/src/omaloon/world/consumers/ConsumeFluid.java +++ b/src/omaloon/world/consumers/ConsumeFluid.java @@ -66,9 +66,9 @@ public HasPressure cast(Building build) { public void display(Stats stats) { if (amount != 0) { if (continuous) { - stats.add(amount > 0 ? OlStats.removeFluid : OlStats.addFluid, OlStats.fluid(fluid, Math.abs(amount), 1f, true)); + stats.add(amount > 0 ? Stat.input : Stat.output, OlStats.fluid(fluid, Math.abs(amount), 1f, true)); } else { - stats.add(amount > 0 ? OlStats.removeFluid : OlStats.addFluid, OlStats.fluid(fluid, Math.abs(amount), 60f, false)); + stats.add(amount > 0 ? Stat.input : Stat.output, OlStats.fluid(fluid, Math.abs(amount), 60f, false)); } } diff --git a/src/omaloon/world/meta/OlStats.java b/src/omaloon/world/meta/OlStats.java index 9c2c2ace..65cca68a 100644 --- a/src/omaloon/world/meta/OlStats.java +++ b/src/omaloon/world/meta/OlStats.java @@ -18,9 +18,6 @@ public class OlStats { minSpeed = new Stat("omaloon-min-speed"), maxSpeed = new Stat("omaloon-max-speed"), - addFluid = new Stat("omaloon-add-fluid", StatCat.crafting), - removeFluid = new Stat("omaloon-remove-fluid", StatCat.crafting), - fluidCapacity = new Stat("omaloon-fluid-capacity", StatCat.liquids), density = new Stat("omaloon-density"), @@ -37,6 +34,8 @@ public class OlStats { optimalPressure = new Stat("omaloon-optimal-pressure", pressure); public static final StatUnit + blocksCubed = new StatUnit("omaloon-blocks-cubed"), + densityUnit = new StatUnit("omaloon-density-unit", "\uC357"), viscosityUnit = new StatUnit("omaloon-viscosity-unit", "\uC357"), diff --git a/src/omaloon/world/meta/PressureConfig.java b/src/omaloon/world/meta/PressureConfig.java index 7cff4ee8..e50df3a5 100644 --- a/src/omaloon/world/meta/PressureConfig.java +++ b/src/omaloon/world/meta/PressureConfig.java @@ -52,7 +52,7 @@ public class PressureConfig { /** * Standard capacity for this block. Does not define max amount that this can hold. That is defined by maxPressure and minPressure. */ - public float fluidCapacity = 5; + public float fluidCapacity = 8; /** * List of blocks that are allowed/disallowed (depends on isWhitelist true/false) for pressure connections. @@ -78,7 +78,7 @@ public class PressureConfig { }; public void addStats(Stats stats) { - stats.add(OlStats.fluidCapacity, Core.bundle.get("stat.omaloon-fluid-capacity.format"), fluidCapacity/8f, fluidCapacity/8f, fluidCapacity/8f); + stats.add(OlStats.fluidCapacity, StatValues.number(fluidCapacity/8f, OlStats.blocksCubed)); stats.add(OlStats.maxPressure, OlStats.pressure(maxPressure, true)); stats.add(OlStats.minPressure, OlStats.pressure(minPressure, true)); From 2346a87df19c21b02d68c6bc78b8f2e77cb0ee86 Mon Sep 17 00:00:00 2001 From: Elizabeth Aurora <84468589+uujuju1@users.noreply.github.com> Date: Sun, 2 Feb 2025 21:23:14 -0300 Subject: [PATCH 54/54] Update BlastTower.java --- .../world/blocks/defense/BlastTower.java | 72 +------------------ 1 file changed, 1 insertion(+), 71 deletions(-) diff --git a/src/omaloon/world/blocks/defense/BlastTower.java b/src/omaloon/world/blocks/defense/BlastTower.java index 3b1e4e62..d8d91ebc 100644 --- a/src/omaloon/world/blocks/defense/BlastTower.java +++ b/src/omaloon/world/blocks/defense/BlastTower.java @@ -103,67 +103,6 @@ public float efficiencyMultiplier() { return val; } - @Override - public void updateTile() { - updatePressure(); - dumpPressure(); - super.updateTile(); - - targets.clear(); - Units.nearbyEnemies(team, x, y, range, u -> { - if(u.checkTarget(targetAir, targetGround)) { - targets.add(u); - } - }); - - indexer.allBuildings(x, y, range, b -> { - if(b.team != team){ - targets.add(b); - } - }); - - float effMultiplier = efficiencyMultiplier(); - - if (targets.size > 0 && canConsume()) { - smoothProgress = Mathf.approach(smoothProgress, 1f, Time.delta / chargeTime * effMultiplier); - - if (efficiency > 0 && (charge += Time.delta * effMultiplier) >= reload && smoothProgress >= 0.99f) { - shoot(); - charge = 0f; - } - } else { - smoothProgress = Mathf.approach(smoothProgress, 0f, Time.delta / chargeTime * effMultiplier); - } - } - - public void shoot() { - if (!canConsume()) return; - - consume(); - lastShootTime = Time.time; - Effect.shake(shake, shake, this); - shootSound.at(this); - waveEffect.layer(Layer.blockUnder).at(x, y, range, waveColor); - tile.getLinkedTiles(t -> OlFx.hammerHit.layer(Layer.blockUnder).at( - t.worldx(), t.worldy(), - angleTo(t.worldx(), t.worldy()) + Mathf.range(360f), - Tmp.c1.set(t.floor().mapColor).mul(1.5f + Mathf.range(0.15f))) - ); - - float damageMultiplier = efficiencyMultiplier(); - for (Teamc target : targets) { - hitEffect.at(target.x(), target.y(), hitColor); - if(target instanceof Healthc){ - ((Healthc)target).damage(damage * damageMultiplier); - } - if(target instanceof Statusc){ - ((Statusc)target).apply(status, statusDuration); - } - } - - smoothProgress = 0f; - } - @Override public void draw() { Draw.rect(region, x, y); @@ -181,15 +120,6 @@ public void drawSelect(){ Drawf.dashCircle(x, y, range, Pal.accent); } - public float efficiencyMultiplier() { - float val = 1f; - if (!useConsumerMultiplier) return val; - for (Consume consumer : consumers) { - val *= consumer.efficiencyMultiplier(this); - } - return val; - } - @Override public void onProximityUpdate() { super.onProximityUpdate(); @@ -285,4 +215,4 @@ public void write(Writes write) { pressure.write(write); } } -} \ No newline at end of file +}