From 9b628723aa868b984a30e07567ad8bce16ecfdad Mon Sep 17 00:00:00 2001 From: QmelZ <59574967+QmelZ@users.noreply.github.com> Date: Tue, 28 Apr 2026 17:49:31 +0300 Subject: [PATCH 01/15] rename bundle to get proper syntax hl and match base game bundles --- assets/bundles/{bundle.shitpost => bundle_shitpost.properties} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename assets/bundles/{bundle.shitpost => bundle_shitpost.properties} (100%) diff --git a/assets/bundles/bundle.shitpost b/assets/bundles/bundle_shitpost.properties similarity index 100% rename from assets/bundles/bundle.shitpost rename to assets/bundles/bundle_shitpost.properties From be15f8497bf233f925ab50b4d918f2fa812994fb Mon Sep 17 00:00:00 2001 From: Sh1p*nfire <73347888+Sh1penfire@users.noreply.github.com> Date: Wed, 29 Apr 2026 02:13:41 +1000 Subject: [PATCH 02/15] Fix invert ambient being the default --- src/meld/ui/MeldSettings.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/meld/ui/MeldSettings.java b/src/meld/ui/MeldSettings.java index 61aed77..9ecccb0 100644 --- a/src/meld/ui/MeldSettings.java +++ b/src/meld/ui/MeldSettings.java @@ -59,7 +59,7 @@ public static void loadSettings(){ Vars.ui.settings.addCategory(Core.bundle.get("settings.meld-title"), Meld.prefix("icon"), t -> { check(t, SettingKeys.lighting, true, b -> replaceLighting = b); - check(t, SettingKeys.invertAmbient, true, b -> invertAmbient = b); + check(t, SettingKeys.invertAmbient, false, b -> invertAmbient = b); check(t, SettingKeys.connectedSonar, true, b -> connectedSonar = b); check(t, SettingKeys.overlayOverFog, true, b -> overlayOverFog = b); From d70c6eaa87c51ac6a7272a4136d6052942677137 Mon Sep 17 00:00:00 2001 From: Sh1p*nfire Date: Wed, 29 Apr 2026 02:43:14 +1000 Subject: [PATCH 03/15] coudn't resist --- assets/icon.png | Bin 3223 -> 13747 bytes assets/sprites-override/ui/logo.png | Bin 0 -> 36292 bytes assets/sprites/icon.png | Bin 3223 -> 13747 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/sprites-override/ui/logo.png diff --git a/assets/icon.png b/assets/icon.png index c414abd963e6bd2986ea4ac61854c1643e68ceda..cf83392aa2cd19ec4ad6227d07803ae62abb4830 100644 GIT binary patch literal 13747 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 delta 3206 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 diff --git a/assets/sprites-override/ui/logo.png b/assets/sprites-override/ui/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c35c253799d25e432567da05d4d001097e41e582 GIT binary patch literal 36292 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 VHV2nYtp)%9002ovPDHLkV1nR-$|3*& literal 0 HcmV?d00001 diff --git a/assets/sprites/icon.png b/assets/sprites/icon.png index c414abd963e6bd2986ea4ac61854c1643e68ceda..cf83392aa2cd19ec4ad6227d07803ae62abb4830 100644 GIT binary patch literal 13747 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 delta 3206 zcmV;140-djYnK_2Fn_V3AtMLj{E( z-7WZFDG^%A_MwzD3fnH;4R)z0R^*npLe~`fQrYgqhN2IlMJj<<78bFUr52P#N;Y{> zf<814(wAZ%(sTFx^Ph9(oSFG=F8v_j{qKKg&V1jQGc#xA|9>6$&JTY05;Cy1x)!}> zWOSrRd7g55jTjG-?X4y&)hbT8-%{UpA=XaG_9Ow;R@cmAq>%RiDguWc4cJiwlIAgR zWOSsj$wuVb*z$ODZiS@?MVq%uJA-FbB zy9d7X<%2H)0EYGqxeK2gdjkNVCV+&PFqC|RCW0n_Mm~ikghc+vz4d6ByABQ4u7&MD z+q(h)_(VYRDJ()rB5>p*VqQeidG$>I0Jzq^qS`UjnSZT(Zr{3E`F$x+F=#tj0RU_w zaO8)GiGf1QpZXPRYzWTy5R^PkfROwq5fh*`4Sn|H830s;K*CS0{H6%`09E1<8~4^# z5vm?ebQ%HnKaTV2yv z!l9S$JAXF?`_4^enx`Yh!>r^_435ImrFnPx6wen|;Q8VT``xZX!)Edkt)V?bfPWPK z`14;xuSgX_^D_FKB*N158_8>giNR6z`;B|+QSl#LUSzLJ#9L750h}0EI9Gv31h0V- z8KJjZygx>MSg)lQVo$KNOPk@bAxQf{h)@Ksi+@^-TNL+poL^0Oh@(vuoqtIy}0(D25+v8In`80?cCnTx=}R7AD@XQ<8iN z?;0l7JE`|0@kig8uH6@MTFX@dL^90J|)Ce#6F>=H2Eo%Ttgnj3xT;%VcJW#n#y&v})IAouScyxKOm?zOPwW%NX zoyGH~7tXTRQ^&2GX*r_Eu@p3<#Pkfy@`Mt4uQp+@I!g?((8$Gp39b+nn-S%DM1Kj7 zYPt?2Uvdx+`2d0du@eI^5mFl23-WX73MUbs)v>nEEcSpL5q3_EnR6isOK5m-_v7xr zxw1X$6{`rIc4*$8bT%|a1dnHUK*^`b={eeOy$+-S44d4D)f zM5GGnT}2~85uyTkdqJvU{f5}NB7Y82+rzzeDnjf2NB7+oh2TUeC4>}uV#wKuL0oHJ zVTI7z=52Qi06-JLdc;o(0Zrub!z341_ruNA%I8!e0k(wD_6tIA_ei~<8-h3y-hSmZ zIC<=Z*-%OZ9gI_FLph|ChG&LlMeSS=jZJjR@8q!)E+MRtgb4@ZhnuT4kAJqHWG|Q) z9A$t1;O@uWKMm1j93DlXBIGRFt=&};fol*Ybm`K3(l~?VTE&9q(wtYFR%!~i9i!)IRh%!b8)4i9L_ql*3LJ@#0Lb$q24MpMa zq;)|GBoSihZpwSnln5z{B7cuJml#K+diPHrND{TLR>Aq(M5oHq)7HY&x8Z7$cOn`t*h|r{XGEC4DnVx++2-jBqs((8ygQU+?nhC`}~npU0ba6q5bWP9q9bDUHQ&D z2;*_<+~;gl(d)rh!i76?$@>!k0PTyN%IBy6x4!x$siG!ON`D0J+9ezlXpgX9^1ZiU z@ZC=*CR7Ad53qCCdP!nymsU#R6( z1epH*O!p7KM}K~=Jh303?c8}q=n8R>L}&rX zWYeiruV9@bZpZ4E6G2K_;KDU#XUpR0y+G=og5?!t+aVS=U_V{1ixnM&rCv}n>_`M{ zca8^vX?8BlYdIW7+wpXHy&^;_ykJ2{e$I|qzmS{?+xK`)gxBZcmUJExu9EK!AnFl$Wt;b>qT{zMxP#sS)-F50X+5NQgwtg*$WN z5dD+Ulqv@;UQhy=+}tx#C}bLQoT*X(xrKGX1K)-x}LOhs>e$x zC4#qXFRU+Xjq$hx0ATm{aFJ;!^=`>H`qZH`aDN_sXF57N3Qu9gUi__*&piq0dC7Oq zgNOqQA3f;4z8*#R+^_#;`Z4u>%X{FsH*jeUjUCDYsLo7iUGxoB+`Wj{^T5`8zxKYk z7iSK#*LRN(SH}R)8i0C~METO8BU$OSvaD!ZCqH0M6S(gkfG30Du=k^M5Ss)HRmM)(-b#9Vr6jl23bZ7;;j`2l!t) zT0*!N(5o}~8d0e>lqA0-27ddyKfVNzXFxP9A)%>9MXkr&X%FDMKb3q>J}K4%Bz~j& z0iS#~PkFj&@7+c75?6x!UOsa5ba}lx3rZ0o_avOwV9$ddQr!2H;Uyg>9Vy;l+kX*D zK~Ct2d07eaQ_Av!oB2InUV+EUTQ+Ir10)LIN!DpwiqiEa2-}Y5i%|p(l`YBGK-`Ph zhc!u*^mIQWd=MlBG19{@U)vJ~s0y)p`X)SxR7#U_T2hKmYpr_?6iA*VQtW#RI1$3> zcxXE&FaLgQuvXrO3yX00_||S3H-E-D$L+jNe)fl$nKi^j&;%HK z_k`(`2nwN*kNDzvJssYN0GJ((dUM^}~{IO1Y<)88CEKGn551)-x@%X+-LvL%3I zY%2LBLB-O9kVJ^Jf!gdn7aJ?r!bi(XvQ{C57CyX3V8XIJB53z>1nnLl?*5fPOoT=r sQ?(FWLIh77=kB$PQ&u6gvb5gtUmy;5_I;GD9smFU07*qoM6N<$f^Jh6vj6}9 From 00838bddc1119b90c59cb5339d7b8ab42e5310f1 Mon Sep 17 00:00:00 2001 From: Sh1p*nfire Date: Wed, 29 Apr 2026 02:43:39 +1000 Subject: [PATCH 04/15] keeping the mod.hjson up to date --- mod.hjson | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod.hjson b/mod.hjson index d51d277..065f64a 100644 --- a/mod.hjson +++ b/mod.hjson @@ -19,7 +19,7 @@ subtitle: "[[]accent]What choice do I have...[[]]" version: gameplay test 5 #the minimum game build required to run this mod -minGameVersion: 154 +minGameVersion: 157 #this is a java mod java: true From 1dbbfcccef09a216a4dcaa0bf3d62f2d49c75bca Mon Sep 17 00:00:00 2001 From: QmelZ <59574967+QmelZ@users.noreply.github.com> Date: Tue, 28 Apr 2026 19:54:17 +0300 Subject: [PATCH 05/15] shitpost bundle --- src/meld/Meld.java | 7 +++++- src/meld/core/Bundles.java | 44 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 src/meld/core/Bundles.java diff --git a/src/meld/Meld.java b/src/meld/Meld.java index 7affe5f..1f20355 100644 --- a/src/meld/Meld.java +++ b/src/meld/Meld.java @@ -39,11 +39,16 @@ public class Meld extends Mod{ public static NativeJavaPackage p = null; public static Melting melting; - + public Meld(){ Events.on(EventType.ClientLoadEvent.class, e -> { MeldRegions.load(); }); + + Events.on(FileTreeInitEvent.class, e -> { + // TODO: potentially run earlier? + Bundles.load(); + }); } public static String prefix(String in){ diff --git a/src/meld/core/Bundles.java b/src/meld/core/Bundles.java new file mode 100644 index 0000000..9f11fbb --- /dev/null +++ b/src/meld/core/Bundles.java @@ -0,0 +1,44 @@ +package meld.core; + +import java.util.*; +import arc.*; +import arc.struct.*; +import arc.util.*; +import arc.util.io.*; +import meld.*; +import mindustry.*; +import mindustry.ui.dialogs.*; + +import static arc.Core.*; + +// very hacky dont do this +public final class Bundles{ + private static final Locale locale = new Locale("shitpost"); + + private Bundles(){} + + public static void load(){ + setupLocale(); + loadBundle(); + } + + private static void setupLocale(){ + Vars.locales = new Seq<>(Vars.locales).add(locale).toArray(); + LanguageDialog.displayNames.put(locale.toString(), "Meld Shitpost"); + } + + private static void loadBundle(){ + if(!settings.getString("locale").equals(locale.toString())) return; + Log.info("loading meld shitpost bundle"); + + var modRoot = Vars.mods.getMod(Meld.name).root; + var bundleFile = modRoot.child("bundles").child("bundle_" + locale + ".properties"); + if(!bundleFile.exists()){ + Log.warn("couldn't find shitpost bundle"); + return; + } + + Reflect.set(bundle, "locale", locale); + PropertiesUtils.load(bundle.getProperties(), bundleFile.reader()); + } +} From 889bca7648d4efbcf6dc14f50297884f9248a6f8 Mon Sep 17 00:00:00 2001 From: Sh1p*nfire Date: Wed, 29 Apr 2026 14:52:11 +1000 Subject: [PATCH 06/15] Standardising overlay drawers, adding bundle entries -fabricator battery should only use up charge when the build plan is valid -Even. More- Overlay. UI. -Unit immunities should be fixed, now handled in MeldMappings --- assets/bundles/bundle.properties | 81 ++++++++++++------- src/meld/content/MeldBlocks.java | 2 +- src/meld/content/MeldBullets.java | 3 + src/meld/content/MeldMappings.java | 23 ++++++ src/meld/content/MeldStatusEffects.java | 4 +- src/meld/content/MeldUnits.java | 9 +-- src/meld/entities/unit/BulbheadEntity.java | 5 +- .../abilities/FabricatorBatteryAbility.java | 10 +-- .../unit/abilities/SlipstreamHullAbility.java | 3 +- .../unit/abilities/SolidSpeedAbility.java | 2 +- src/meld/graphics/TextModifiers.java | 42 ++++++++++ src/meld/graphics/TileDrawers.java | 30 +++++++ src/meld/world/WorldUtil.java | 8 +- src/meld/world/blocks/defense/LakeRim.java | 10 +++ src/meld/world/blocks/production/Depot.java | 1 + .../blocks/production/GrindingQuary.java | 71 +++++++++++++--- .../blocks/production/SingleBeamDrill.java | 46 +++++++++-- .../world/blocks/units/UnitLogisticsPad.java | 12 +++ 18 files changed, 290 insertions(+), 72 deletions(-) create mode 100644 src/meld/graphics/TextModifiers.java create mode 100644 src/meld/graphics/TileDrawers.java diff --git a/assets/bundles/bundle.properties b/assets/bundles/bundle.properties index 0c1c6a2..f0e853b 100644 --- a/assets/bundles/bundle.properties +++ b/assets/bundles/bundle.properties @@ -88,6 +88,12 @@ block.meld2-shadesteel-shingles.name = Shadesteel Shingles block.meld2-shadesteel-shingles.description = Mundane and bulky. block.meld2-shadesteel-shingles.details = Brick of Shadesteel bricks of Shadesteel ingots. +block.meld2-gate-spike.name = Gate Spike +block.meld2-gate-spike.description = Acts as a door. Causes all connected doors to enabling or disable when toggled. + +block.meld2-lake-rim.name = Lake Rim +block.meld2-lake-rim.description = Acts as a door, only placeable on the shoreline. + block.meld2-barricade.name = Barricade block.meld2-barricade.description = Provides cover against enemy projectiles.\nQuick to build.\n\nEasy way to store Compacted Bricks/Stony Gloop outside of the core for onsite use.\n\n[accent]Armored.[] @@ -1120,44 +1126,41 @@ status.meld2-fringe.name = Fringe status.meld2-fringe.description = Enlightens materials into a useable form. status.meld2-fringe.details = Hello Strata! -status.meld2-mangrove-a0-refreshed.name = Refreshed -status.meld2-mangrove-a0-refreshed.description = Doubles reload speed and slightly reduces damage taken. Invokes slight regeneration. - -status.meld2-mangrove-a1-infested.name = Infested -status.meld2-mangrove-a1-infested.description = Hefty amount of DoT an' damage taken and dealt is magnified. Doubles... reload speed?\n\n[gray]What applies this again?\nI don't know, but we've got to ru-[]\n[red][] +status.meld2-refreshed.name = Refreshed +status.meld2-refreshed.description = Doubles reload speed and slightly reduces damage taken. Invokes slight regeneration. -status.meld2-mangrove-b0-shattered-flame.name = Shattered Flame -status.meld2-mangrove-b0-shattered-flame.description = Sacrifice is power. +status.meld2-infested.name = Infested +status.meld2-infested.description = Hefty amount of DoT an' damage taken and dealt is magnified. Doubles... reload speed?\n\n[gray]What applies this again?\nI don't know, but we've got to ru-[]\n[red][] -status.meld2-mangrove-d0-mercury-poisoning.name = Mercury Poisoning -status.meld2-mangrove-d0-mercury-poisoning.description = Extremely deadly to critters of [#ea9ad6]Meld[] origin. Effects unknown.\n[gray]TODO: Update this for Strata +status.meld2-shattered-flame.name = Shattered Flame +status.meld2-shattered-flame.description = Sacrifice is power. -status.meld2-mangrove-d1-slippery.name = Mercury Coating -status.meld2-mangrove-d1-slippery.description = Coating of [#89828c]Mercury[].\n[gray]Fun!\nHey don't eat that-[] +status.meld2-mercury-poisoning.name = Mercury Poisoning +status.meld2-mercury-poisoning.description = Extremely deadly to critters of [#ea9ad6]Meld[] origin. Effects unknown.\n[gray]TODO: Update this for Strata -status.meld2-strata-a0-rally.name = Rally -status.meld2-strata-a0-rally.description = Increased mobility and reload. Applied by [accent]Commanders[] and [accent]Sonars[]. +status.meld2-slippery.name = Mercury Coating +status.meld2-slippery.description = Coating of [#89828c]Mercury[].\n[gray]Fun!\nHey don't eat that-[] -status.meld2-strata-a1-primed.name = Primed -status.meld2-strata-a1-primed.description = Increased mobility, damage, reload. Heavly increased health. This unit's ready to go off! +status.meld2-rally.name = Rally +status.meld2-rally.description = Increased mobility and reload. Applied by [accent]Commanders[] and [accent]Sonars[]. -status.meld2-strata-b0-anchored.name = Anchored -status.meld2-strata-b0-anchored.description = Heavly increased drag and health. Heavly decreased speed. Applied by [accent]Movement Anchors[] +status.meld2-anchored.name = Anchored +status.meld2-anchored.description = Heavly increased drag and health. Heavly decreased speed. Applied by [accent]Movement Anchors[] -status.meld2-strata-b1-rebound.name = Rebound -status.meld2-strata-b1-rebound.description = Heavly increased speed, slightly increased reload speed. Decreased drag. Applied by [accent]Movement Anchors[] +status.meld2-rebound.name = Rebound +status.meld2-rebound.description = Heavly increased speed, slightly increased reload speed. Decreased drag. Applied by [accent]Movement Anchors[] -status.meld2-wildlife-a0-amplified.name = Amplified -status.meld2-wildlife-a0-amplified.description = Amplifies mobility, durability and reload. Applied by [#ea9ad6]Meld Amplifiers[]. +status.meld2-amplified.name = Amplified +status.meld2-amplified.description = Amplifies mobility, durability and reload. Applied by [#ea9ad6]Meld Amplifiers[]. -status.meld2-wildlife-a1-reconstitution.name = Reconstitution -status.meld2-wildlife-a1-reconstitution.description = Increases durability and drag. Slightly decreases speed. Light regeneration. Applied by [#ea9ad6]Meld Beacons[]. Certain constructs spawn with this.\nOnly affects biological targets. +status.meld2-reconstitution.name = Reconstitution +status.meld2-reconstitution.description = Increases durability and drag. Slightly decreases speed. Light regeneration. Applied by [#ea9ad6]Meld Beacons[]. Certain constructs spawn with this.\nOnly affects biological targets. -status.meld2-wildlife-b0-sentry.name = Sentry -status.meld2-wildlife-b0-sentry.description = Heavily reduced mobility, but double fireate. Does constant DoT.\nCertain constructs apply this upon shooting. +status.meld2-sentry.name = Sentry +status.meld2-sentry.description = Heavily reduced mobility, but double fireate. Does constant DoT.\nCertain constructs apply this upon shooting. -status.meld2-wildlife-c0-surge.name = Surge -status.meld2-wildlife-c0-surge.description = Massive boost in reload speed, but heavly decreased damage.\nCertain constructs can intiate a surge with a long cooldown. +status.meld2-surge.name = Surge +status.meld2-surge.description = Massive boost in reload speed, but heavly decreased damage.\nCertain constructs can intiate a surge with a long cooldown. status.meld2-lacerated.name = Lacerated status.meld2-lacerated.description = Heavly reduced mobility and fireate. Increases durability slightly and encourages light regeneration.\n\nApplied by [#4bb66b]Resonarum[] related sources. No effect on armored meld or inorganic targets. @@ -1301,6 +1304,22 @@ objective.wavestarting = [accent]Waves starting in:[] [lightgray]{0}[] ability.spawndeath = Death Spawn(s) +ability.solidspeed = Solid Speed +ability.solidspeed.description = Speed when traveling on solid floors +ability.solidspeed.multi = Speed multiplier: {0}x + +ability.slipstreamhull = Slipstream Hull +ability.slipstreamhull.description = Moves unimpeded by sticky terrain! + +ability.beached = Beaches +ability.beached.description = Able to move on land, but rapidly loses speed. + +ability.fabricatorbattery = Fabricator Battery +ability.fabricatorbattery.description = Unit builds 5x as quickly while it has charge. + +ability.deathbirth = Death Birth +ability.deathbirth.description = Units spawned have a short, intense regeneration. + //Vanilla modifications research = Defragment researched = [lightgray]Defragmentation Progress: {0}% @@ -1359,4 +1378,10 @@ bar.spool = Spool stat.aspect-efficiency = Efficiency stat.aspect-density = Density -stat.aspect-stats = Aspect Stats \ No newline at end of file +stat.aspect-stats = Aspect Stats + +overlay.deposit-missing = No deposits found :c +overlay.ore-missing = No ores found :c +overlay.drop-missing = Nothing to harvest... +overlay.friendly-fire = +overlay.in-fog = \ No newline at end of file diff --git a/src/meld/content/MeldBlocks.java b/src/meld/content/MeldBlocks.java index 883b321..312ecf0 100644 --- a/src/meld/content/MeldBlocks.java +++ b/src/meld/content/MeldBlocks.java @@ -1158,7 +1158,7 @@ public void update(Bullet b){ lakeRim = new LakeRim("lake-rim"){{ requirements(Category.defense, with(MeldItems.debris, 4)); size = 1; - health = 120; + health = 400; }}; frictionPad = new FrictionPad("friction-pad"){{ diff --git a/src/meld/content/MeldBullets.java b/src/meld/content/MeldBullets.java index c5930fc..fd62ff7 100644 --- a/src/meld/content/MeldBullets.java +++ b/src/meld/content/MeldBullets.java @@ -260,6 +260,9 @@ public static void load(){ bulletInterval = 2; + status = MeldStatusEffects.impaled; + statusDuration = 30; + fragBullet = new BasicBulletType(9, 4, Meld.prefix("clump")){{ speed = 9; damage = 0.5f; diff --git a/src/meld/content/MeldMappings.java b/src/meld/content/MeldMappings.java index 5aea3aa..63fbe3d 100644 --- a/src/meld/content/MeldMappings.java +++ b/src/meld/content/MeldMappings.java @@ -1,10 +1,13 @@ package meld.content; +import arc.struct.Seq; import meld.world.blocks.production.GrindingQuary; import meld.world.blocks.production.GrindingQuary.GrinderEntry; import mindustry.content.Planets; import mindustry.content.UnitTypes; import mindustry.type.ItemStack; +import mindustry.type.StatusEffect; +import mindustry.type.UnitType; import static meld.content.MeldEnvironment.*; import static meld.content.MeldLiquids.*; @@ -47,5 +50,25 @@ public static void loadAfter(){ UnitTypes.alpha.databaseTabs.clear(); UnitTypes.alpha.postInit(); + //TODO: Move to separate class? + Seq bioImmunities = Seq.with(MeldStatusEffects.aspectBurn); + Seq armorImmunities = Seq.with(MeldStatusEffects.lacerated, MeldStatusEffects.impaled); + Seq mechanicalImmunities = Seq.with(MeldStatusEffects.lacerated, MeldStatusEffects.impaled); + + Seq bio = Seq.with( + MeldUnits.blob, MeldUnits.craig, MeldUnits.braig, + MeldUnits.jilla, MeldUnits.scorcher + ); + Seq armor = Seq.with( + MeldUnits.afraig, MeldUnits.globkin, + MeldUnits.kathid + ); + Seq mechanical = Seq.with( + MeldUnits.bulbhead, MeldUnits.shark + ); + + bio.each(b -> b.immunities.addAll(bioImmunities)); + armor.each(b -> b.immunities.addAll(armorImmunities)); + mechanical.each(b -> b.immunities.addAll(mechanicalImmunities)); } } diff --git a/src/meld/content/MeldStatusEffects.java b/src/meld/content/MeldStatusEffects.java index 1433c11..218925a 100644 --- a/src/meld/content/MeldStatusEffects.java +++ b/src/meld/content/MeldStatusEffects.java @@ -222,7 +222,7 @@ public void update(Unit unit, StatusEntry entry) { unit.dragMultiplier *= Mathf.clamp(3 - entry.time/300, 1f, 3); }{ dragMultiplier = 3; - }}; + }}; //Only affects unarmored lacerated = new StatusEffect("lacerated"){{ @@ -247,7 +247,7 @@ public void update(Unit unit, StatusEntry entry) { }; impaled = new StatusEffect("impaled"){{ - damage = 0.2f; + damage = 1f; speedMultiplier = 0.45f; buildSpeedMultiplier = 0.5f; }}; diff --git a/src/meld/content/MeldUnits.java b/src/meld/content/MeldUnits.java index 9a8dd86..eea9851 100644 --- a/src/meld/content/MeldUnits.java +++ b/src/meld/content/MeldUnits.java @@ -10,6 +10,7 @@ import arc.math.Interp; import arc.math.Mathf; import arc.struct.ObjectIntMap; +import arc.struct.Seq; import arc.util.Log; import arc.util.Tmp; import meld.*; @@ -1000,8 +1001,6 @@ public static void load(){ }} ); - immunities.addAll(MeldStatusEffects.aspectBurn); - weapons.addAll(craigWeapon(-3, 0)); constructor = LegsUnit::create; @@ -1130,8 +1129,6 @@ public static void load(){ }} ); - immunities.addAll(MeldStatusEffects.aspectBurn); - constructor = LegsUnit::create; }}; @@ -1187,7 +1184,6 @@ public static void load(){ }} ); - immunities.addAll(MeldStatusEffects.aspectBurn); constructor = LegsUnit::create; }}; @@ -1353,7 +1349,6 @@ public static void load(){ }} ); - immunities.addAll(MeldStatusEffects.lacerated); constructor = LegsUnit::create; }}; @@ -1409,7 +1404,6 @@ public static void load(){ }}; }} ); - immunities.addAll(MeldStatusEffects.aspectBurn); constructor = CrawlUnit::create; }}; @@ -1696,7 +1690,6 @@ public static void load(){ }}; }} ); - immunities.addAll(MeldStatusEffects.lacerated); constructor = LegsUnit::create; }}; diff --git a/src/meld/entities/unit/BulbheadEntity.java b/src/meld/entities/unit/BulbheadEntity.java index 49e6808..7eab08d 100644 --- a/src/meld/entities/unit/BulbheadEntity.java +++ b/src/meld/entities/unit/BulbheadEntity.java @@ -156,7 +156,10 @@ public void rotateMove(Vec2 vec) { } public void getNearbyLink(){ - if(CoreRaft.rafts.isEmpty()) return; + if(CoreRaft.rafts.isEmpty()) { + nearbyRaft = null; + return; + } nearbyRaft = CoreRaft.rafts.sort(raft -> raft.dst(this)).first(); if(!within(nearbyRaft, type.fogRadius * Vars.tilesize)) nearbyRaft = null; } diff --git a/src/meld/entities/unit/abilities/FabricatorBatteryAbility.java b/src/meld/entities/unit/abilities/FabricatorBatteryAbility.java index 4f0a889..58007e2 100644 --- a/src/meld/entities/unit/abilities/FabricatorBatteryAbility.java +++ b/src/meld/entities/unit/abilities/FabricatorBatteryAbility.java @@ -78,20 +78,14 @@ public void update(Unit unit) { } if(active){ - if(enabled){ + if(enabled && unit.buildPlan().build() != null){ charge -= Time.delta * drainSpeed; unit.buildSpeedMultiplier *= speedMulti; zapTimer += Time.delta; if(zapTimer > 12){ zapTimer %= 12; Vec2 targ = new Vec2(); - if(unit.buildPlan().build() != null) { - targ.set(unit.buildPlan().build().x, unit.buildPlan().build().y); - } - else { - Tmp.v1.trns(Mathf.random(360), unit.type.hitSize + Mathf.random(0, 12)).add(unit); - targ.set(Tmp.v1); - } + targ.set(unit.buildPlan().build().x, unit.buildPlan().build().y); MeldFx.chainLightning.at(unit.x, unit.y, 0, Pal.accent, new MeldFx.VisualLightningHolder() { @Override diff --git a/src/meld/entities/unit/abilities/SlipstreamHullAbility.java b/src/meld/entities/unit/abilities/SlipstreamHullAbility.java index 994a2fc..f3e163e 100644 --- a/src/meld/entities/unit/abilities/SlipstreamHullAbility.java +++ b/src/meld/entities/unit/abilities/SlipstreamHullAbility.java @@ -13,7 +13,8 @@ public void update(Unit unit) { super.update(unit); if(unit.tileOn() != null) { Tile tile = unit.tileOn(); - unit.dragMultiplier /= Math.max(unit.tileOn().floor().dragMultiplier, 1); + unit.dragMultiplier /= Math.max(tile.floor().dragMultiplier, 1); + unit.speedMultiplier /= Math.max(tile.floor().speedMultiplier, 1); //TODO: Better wakes for naval units /* diff --git a/src/meld/entities/unit/abilities/SolidSpeedAbility.java b/src/meld/entities/unit/abilities/SolidSpeedAbility.java index 1665b6a..1764022 100644 --- a/src/meld/entities/unit/abilities/SolidSpeedAbility.java +++ b/src/meld/entities/unit/abilities/SolidSpeedAbility.java @@ -12,8 +12,8 @@ public class SolidSpeedAbility extends Ability { public SolidSpeedAbility(){ super(); - } + @Override public void update(Unit unit) { super.update(unit); diff --git a/src/meld/graphics/TextModifiers.java b/src/meld/graphics/TextModifiers.java new file mode 100644 index 0000000..e9cab50 --- /dev/null +++ b/src/meld/graphics/TextModifiers.java @@ -0,0 +1,42 @@ +package meld.graphics; + +import arc.Core; +import arc.math.Interp; +import arc.math.Mathf; +import arc.util.Time; + +public class TextModifiers { + + public static char[] glitchChars = new char[]{'-', '=', ',', '&'}; + + //Modifies the input string + public static String glitchy(String input, float edgeMultiplier, float baseChance, float speed){ + if(baseChance == 0) return input; + Mathf.rand.setSeed((int)(Time.globalTime/60 * speed)); + + StringBuilder output = new StringBuilder(); + for (float i = 0; i < input.length(); i++) { + int j = (int)i; + float chance = Mathf.lerp(baseChance, baseChance * edgeMultiplier, Interp.slope.apply(i/input.length())); + if(!Mathf.chance(chance * (1 + edgeMultiplier) * Interp.slope.apply(i/input.length()))){ + output.append(input.charAt(j)); + continue; + } + output.append(glitchChars[Mathf.ceilPositive(Mathf.random(glitchChars.length) - 1)]); + } + return output.toString(); + } + + //Modifies the input string + public static String glitchyNumb(float number, float chance, float speed){ + if(chance == 0) return String.valueOf(number); + Mathf.rand.setSeed((int)(Time.globalTime/60 * speed)); + if(Mathf.chance(chance)) return String.valueOf((int)Mathf.range(number)); + return String.valueOf(number); + } + + //Modifies the input string + public static String glitchyEntry(String input, float edgeMultiplier, float baseChance, float speed){ + return glitchy(Core.bundle.get(input), edgeMultiplier, baseChance, speed); + } +} diff --git a/src/meld/graphics/TileDrawers.java b/src/meld/graphics/TileDrawers.java new file mode 100644 index 0000000..80b5701 --- /dev/null +++ b/src/meld/graphics/TileDrawers.java @@ -0,0 +1,30 @@ +package meld.graphics; + +import arc.graphics.g2d.Draw; +import arc.graphics.g2d.Fill; +import arc.math.Mathf; +import arc.util.Time; +import mindustry.Vars; +import mindustry.graphics.Pal; + +//Class which exclusively draws 1x1 squares. yes. +public class TileDrawers { + + public static float tileRad = Vars.tilesize/2f; + + public static void drawFog(float x, float y, float radius){ + float offset = x/4f + y; + offset/=Vars.tilesize; + Draw.color(Pal.gray, Pal.darkerGray, 0.5f + 0.5f * Mathf.sin(Time.globalTime/4f + offset, 1, 1)); + Draw.alpha(1); + Fill.square(x, y, radius); + Draw.reset(); + } + + public static void drawInvalid(float x, float y, float radius){ + Draw.color(Pal.health); + Draw.alpha(0.5f); + Fill.square(x, y, radius); + Draw.reset(); + } +} diff --git a/src/meld/world/WorldUtil.java b/src/meld/world/WorldUtil.java index 4a42173..356aef7 100644 --- a/src/meld/world/WorldUtil.java +++ b/src/meld/world/WorldUtil.java @@ -52,12 +52,14 @@ public static ItemModule totalQuarry(int x1, int y1, int x2, int y2){ return module; } - public static ItemModule totalQuarry(float x, float y, Block block, boolean blockable){ + public static ItemModule totalQuarry(float x, float y, Block block, boolean blockable, boolean respectFoW){ module.clear(); Tile startTile = world.tileWorld(x, y); if(startTile == null) return module; startTile.getLinkedTilesAs(block, (tile) -> { + if(respectFoW && !Vars.fogControl.isDiscovered(Vars.player.team(), tile.x, tile.y)) return; + if(tile == null || tile.solid() && blockable && tile.block() != block) return; GrindingQuary.GrinderEntry entry = GrindingQuary.grinderMap.get(tile.floor()); @@ -72,13 +74,13 @@ public static ItemModule totalQuarry(float x, float y, Block block, boolean bloc return module; } - public static ObjectFloatMap quarrySpeed(float x, float y, GrindingQuary block){ + public static ObjectFloatMap quarrySpeed(float x, float y, GrindingQuary block, boolean respectFoW){ speeds.clear(); Tile startTile = world.tileWorld(x, y); if(startTile == null) return speeds; startTile.getLinkedTilesAs(block, (tile) -> { - if(tile == null) return; + if(tile == null || respectFoW && !Vars.fogControl.isDiscovered(Vars.player.team(), tile.x, tile.y)) return; Item item = tile.overlay().itemDrop; if(item != null) speeds.put(item, speeds.get(item, 0) + block.drillSpeedOverlay(tile)); diff --git a/src/meld/world/blocks/defense/LakeRim.java b/src/meld/world/blocks/defense/LakeRim.java index 4be9ae6..4f544d2 100644 --- a/src/meld/world/blocks/defense/LakeRim.java +++ b/src/meld/world/blocks/defense/LakeRim.java @@ -21,5 +21,15 @@ public boolean canPlaceOn(Tile tile, Team team, int rotation) { if(nearby.floor().isLiquid) return true; } return false; + + + } + + public class LakeRimBuild extends DoorBuild{ + + @Override + public boolean checkSolid(){ + return !open; + } } } diff --git a/src/meld/world/blocks/production/Depot.java b/src/meld/world/blocks/production/Depot.java index c0b39f2..876cd31 100644 --- a/src/meld/world/blocks/production/Depot.java +++ b/src/meld/world/blocks/production/Depot.java @@ -78,6 +78,7 @@ public void updateTile(){ if(lastItem == null && items.any()){ //branching just for the sake of my sanity here if(sortItem == null || sortItem == items.first()) lastItem = items.first(); + else lastItem = sortItem; } if(lastItem != null){ diff --git a/src/meld/world/blocks/production/GrindingQuary.java b/src/meld/world/blocks/production/GrindingQuary.java index 58e6dce..4b70e54 100644 --- a/src/meld/world/blocks/production/GrindingQuary.java +++ b/src/meld/world/blocks/production/GrindingQuary.java @@ -1,5 +1,6 @@ package meld.world.blocks.production; +import arc.Core; import arc.graphics.Color; import arc.graphics.g2d.Draw; import arc.graphics.g2d.Fill; @@ -13,6 +14,8 @@ import arc.util.io.Reads; import arc.util.io.Writes; import meld.graphics.Draww; +import meld.graphics.TextModifiers; +import meld.graphics.TileDrawers; import meld.world.WorldUtil; import meld.world.blocks.io.BlockIO; import meld.world.util.ItemLogic; @@ -29,6 +32,8 @@ import mindustry.world.consumers.Consume; import mindustry.world.modules.ItemModule; +import static meld.graphics.TileDrawers.tileRad; + public class GrindingQuary extends Block { public static ObjectMap grinderMap = new ObjectMap<>(); @@ -50,24 +55,34 @@ public GrindingQuary(String name) { } public Seq valid = new Seq<>(), overlay = new Seq<>(); + float fogTiles = 0; @Override public void drawOverlay(float x, float y, int rotation) { super.drawOverlay(x, y, rotation); - float drawx = x, drawy = y - (size * Vars.tilesize)/2f - 2; Tile start = Vars.world.tileWorld(x, y); + fogTiles = 0; + float multiplier = 1; if(start != null){ valid.clear(); overlay.clear(); + + if(Vars.control.input.block == null && start.build instanceof GrindingQuaryBuild build && start== build.tile && start.block() == this){ + multiplier = build.boostAmount; + } + start.getLinkedTilesAs(this, tile -> { if(tile != null){ + if(!Vars.fogControl.isDiscovered(Vars.player.team(), tile.x, tile.y)){ + fogTiles++; + TileDrawers.drawFog(tile.worldx(), tile.worldy(), tileRad); + return; + } if(tile.solid() && tile.block() != this){ - Draw.color(Pal.health); - Draw.alpha(0.5f); - Fill.square(tile.worldx(), tile.worldy(), Vars.tilesize/2f); + TileDrawers.drawInvalid(tile.worldx(), tile.worldy(), tileRad); return; } if(grinderMap.containsKey(tile.floor())){ @@ -78,6 +93,7 @@ public void drawOverlay(float x, float y, int rotation) { } } }); + //Draw this in stages valid.each(tile -> { Draw.color(Pal.accent); @@ -93,8 +109,8 @@ public void drawOverlay(float x, float y, int rotation) { valid.each(tile -> { Draw.color(Color.white); - float prog = Mathf.absin(Time.time/30 + (tile.x + tile.y) * Mathf.pi/3, 1, 1); - float prog2 = Time.time/240 + (tile.x + tile.y) * Mathf.pi % 1; + float prog = Mathf.absin(Time.globalTime/30 + (tile.x + tile.y) * Mathf.pi/3, 1, 1); + float prog2 = Time.globalTime/240 + (tile.x + tile.y) * Mathf.pi % 1; Draw.alpha(0.5f + 0.5f * prog); Draw.rect(tile.floor().region, tile.worldx(), tile.worldy() -2 + prog * 4, 4 + 4 * prog, 4 + 4 * Mathf.sin(prog), -15 + 30 * prog + 360 * prog2); }); @@ -107,24 +123,54 @@ public void drawOverlay(float x, float y, int rotation) { } Drawf.text(); - ItemModule depositItems = WorldUtil.totalQuarry(x, y, this, true); + + boolean found = false; + + float fogPercent = fogTiles/size/size; + float fin = fogPercent * fogPercent; + float glitchChance = fin, glitchSpeed = 2 + fin * 8; + + float drawx = x, drawy = y - (size * Vars.tilesize)/2f - 2; + ItemModule depositItems = WorldUtil.totalQuarry(x, y, this, true, true); for (Item item : Vars.content.items()) { float amount = depositItems.get(item); if(amount == 0) continue; - Draww.itemText(item.localizedName + ": " + amount, drawx, drawy, item); + found = true; + Draww.itemText(TextModifiers.glitchy(item.localizedName + ": " + TextModifiers.glitchyNumb(amount, glitchChance * 4, glitchSpeed * 4), 2, glitchChance, glitchSpeed), + drawx, drawy, item); drawy -= 10; } + if(!found){ + Draww.drawTextUnderlined(TextModifiers.glitchyEntry("overlay.deposit-missing", 2, glitchChance, glitchSpeed), + drawx, drawy, Pal.lightishGray); + } + + found = false; drawy = y + (size * Vars.tilesize)/2f + 2; - ObjectFloatMap drillSpeeds = WorldUtil.quarrySpeed(x, y, this); + ObjectFloatMap drillSpeeds = WorldUtil.quarrySpeed(x, y, this, true); for (Item item : Vars.content.items()) { float amount = drillSpeeds.get(item, 0); if(amount == 0) continue; - Draww.itemText(item.localizedName + ": " + amount + "/s", drawx, drawy, item); + found = true; + Draww.itemText(TextModifiers.glitchy(item.localizedName + ": " + TextModifiers.glitchyNumb(amount * multiplier, glitchChance * 4, glitchSpeed * 4) + "/s", 2, glitchChance, glitchSpeed), + drawx, drawy, item); drawy += 10; } + + if(!found){ + Draww.drawTextUnderlined(TextModifiers.glitchyEntry("overlay.ore-missing", 2, glitchChance, glitchSpeed), + drawx, drawy, Pal.lightishGray); + } + + drawx = x - (size * Vars.tilesize)/2f - 2; + drawy = y; + + if(multiplier > 1){ + Draww.drawTextUnderlined(multiplier + "x ", drawx, drawy, Pal.accent); + } } public static class GrinderEntry{ @@ -189,7 +235,10 @@ public boolean shouldConsume() { public void update(){ super.update(); updateDrilling(); - dump(); + + for (Item key : drillTimers.keys()) { + dumpAccumulate(key); + } progress += Time.delta/itemDuration; if(progress >= 1){ diff --git a/src/meld/world/blocks/production/SingleBeamDrill.java b/src/meld/world/blocks/production/SingleBeamDrill.java index 1864ebf..f764aa9 100644 --- a/src/meld/world/blocks/production/SingleBeamDrill.java +++ b/src/meld/world/blocks/production/SingleBeamDrill.java @@ -1,7 +1,9 @@ package meld.world.blocks.production; +import arc.Core; import arc.graphics.Color; import arc.graphics.g2d.Draw; +import arc.graphics.g2d.Fill; import arc.graphics.g2d.Lines; import arc.math.Mathf; import arc.math.geom.Geometry; @@ -12,10 +14,13 @@ import arc.struct.ObjectMap; import arc.util.Log; import arc.util.Time; +import arc.util.Tmp; import arc.util.io.Reads; import arc.util.io.Writes; import meld.content.MeldBullets; import meld.graphics.Draww; +import meld.graphics.TextModifiers; +import meld.graphics.TileDrawers; import mindustry.Vars; import mindustry.content.Fx; import mindustry.entities.Damage; @@ -34,6 +39,7 @@ import mindustry.world.blocks.production.Drill; import mindustry.world.meta.BlockFlag; +import static meld.graphics.TileDrawers.tileRad; import static mindustry.Vars.iconSmall; //HAS TO be an odd number in size. @@ -85,19 +91,29 @@ public void drawOverlay(float x, float y, int rotation) { int tx = (int) x/Vars.tilesize, ty = (int) y/Vars.tilesize; Tile other = null; + float drawy = y + Vars.tilesize * size/2f; + for(int i = 0; i < range; i++) { unusedTiles--; int j = i + offset; other = Vars.world.tile(tx + dir.x * j, ty + dir.y * j); + if(!Vars.fogControl.isDiscovered(Vars.player.team(), other.x, other.y)){ + TileDrawers.drawFog(other.worldx(), other.worldy(), tileRad); + Draww.drawTextUnderlined(TextModifiers.glitchyEntry("overlay.in-fog", 3, 0.15f, 2), x, drawy, Tmp.c1.set(Pal.lightishGray).lerp(Pal.gray, Mathf.absin(Time.globalTime/10f, 1, 1))); + + Drawf.dashLine(Pal.accent, x, y, x + dir.x * (range + offset) * Vars.tilesize, y + dir.y * (range + offset) * Vars.tilesize); + return; + } + if(other.solid()){ found = other.block().itemDrop; int mined = (int)((baseProductivity + distanceProductivity * unusedTiles) * itemMultipliers.get(found, 1)); if(found != null){ Item current = transformItems.get(found, found); - Draww.itemText(mined/drillTime * 60 + " " + current.localizedName + "/s", x, y + Vars.tilesize * size/2f, current); + Draww.itemText(mined/drillTime * 60 + " " + current.localizedName + "/s", x, drawy, current); if(found != current){ - float drawy = y - Vars.tilesize * size/2f; + drawy = y - Vars.tilesize * size/2f; float s = iconSmall / 4f; float textWidth = Draww.drawTextUnderlined("->", x, drawy, Pal.accent); Draw.mixcol(Color.darkGray, 1f); @@ -108,6 +124,12 @@ public void drawOverlay(float x, float y, int rotation) { Draw.rect(current.fullIcon, x + textWidth, drawy, s, s); } } + else if(other.build != null && other.build.team == Vars.player.team()){ + Draww.drawTextUnderlined(Core.bundle.get("overlay.friendly-fire"), x, drawy, Pal.remove); + } + else { + Draww.drawTextUnderlined(Core.bundle.get("overlay.drop-missing"), x, drawy, Pal.accent); + } Lines.stroke(3); Draw.color(Pal.gray); @@ -119,8 +141,11 @@ public void drawOverlay(float x, float y, int rotation) { Drawf.dashLine(Pal.accent, x, y, other.worldx(), other.worldy()); return; } + TileDrawers.drawInvalid(other.worldx(), other.worldy(), tileRad); } - Drawf.dashLine(Pal.accent, x, y, x + dir.x * range * Vars.tilesize, y + dir.y * range * Vars.tilesize); + //We havn't found anything to mine + Draww.drawTextUnderlined(Core.bundle.get("overlay.ore-missing"), x, drawy, Pal.lightishGray); + Drawf.dashLine(Pal.accent, x, y, x + dir.x * (range + offset) * Vars.tilesize, y + dir.y * (range + offset) * Vars.tilesize); } public class SingleBeamBuild extends Building{ @@ -163,12 +188,17 @@ public void drill(){ other = Vars.world.tile(tx + dir.x * j, ty + dir.y * j); if(other.solid()){ - if(bigExplosion == null){ - Damage.dynamicExplosion(other.worldx(), other.worldy(), 5, 5, 30000, Vars.tilesize * 3, true, hitEffect); - Damage.dynamicExplosion(other.worldx(), other.worldy(), 5, 15, 0, Vars.tilesize * 2, true, hitEffect); - } - else bigExplosion.create(this, Team.derelict, other.worldx() - dir.x * Vars.tilesize, other.worldy() - dir.y * Vars.tilesize, 0); if(other.build != null) other.build.damage(targetDamage); + //BOOMY! :D + float boomx = other.worldx(), boomy = other.worldy(); + Time.run(5, () -> { + if(bigExplosion == null){ + Damage.dynamicExplosion(boomx, boomy, 5, 5, 30000, Vars.tilesize * 3, true, hitEffect); + Damage.dynamicExplosion(boomx, boomy, 5, 15, 0, Vars.tilesize * 2, true, hitEffect); + } + else bigExplosion.create(this, Team.derelict, boomx - dir.x * Vars.tilesize, boomy - dir.y * Vars.tilesize, 0); + + }); Item drop = other.wallDrop(); diff --git a/src/meld/world/blocks/units/UnitLogisticsPad.java b/src/meld/world/blocks/units/UnitLogisticsPad.java index c898d42..25cd24d 100644 --- a/src/meld/world/blocks/units/UnitLogisticsPad.java +++ b/src/meld/world/blocks/units/UnitLogisticsPad.java @@ -4,11 +4,13 @@ import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.Mathf; +import arc.math.geom.Geometry; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; import arc.util.io.*; import arc.util.pooling.Pool.*; +import meld.graphics.TileDrawers; import mindustry.Vars; import mindustry.entities.units.*; import mindustry.gen.*; @@ -83,6 +85,16 @@ public void drawOverlay(float x, float y, int rotation) { x += offset; y += offset; + int tx = (int)x/tilesize, ty = (int)y/tilesize; + + int tileRange = (int)(range/tilesize/2f); + for(int dx = -tileRange; dx <= tileRange; dx++){ + for(int dy = -tileRange; dy <= tileRange; dy++){ + if(!fogControl.isDiscovered(player.team(), tx + dx, ty + dy)){ + TileDrawers.drawFog((tx + dx) * tilesize, (ty + dy) * tilesize, TileDrawers.tileRad); + } + } + } Drawf.dashSquare(Pal.accent, x, y, range); } From f40455da9c66e70cfa36760752126ff309d28664 Mon Sep 17 00:00:00 2001 From: Sh1p*nfire Date: Wed, 29 Apr 2026 15:12:26 +1000 Subject: [PATCH 07/15] Made storming aspect boost properly --- src/meld/content/MeldMappings.java | 3 +++ src/meld/world/blocks/production/GrindingQuary.java | 12 ++++++++++++ 2 files changed, 15 insertions(+) diff --git a/src/meld/content/MeldMappings.java b/src/meld/content/MeldMappings.java index 63fbe3d..e587918 100644 --- a/src/meld/content/MeldMappings.java +++ b/src/meld/content/MeldMappings.java @@ -30,6 +30,9 @@ likestone, new GrinderEntry(120, likesalt, with(MeldItems.likestoneSediments, 10 meldCrystalFloor, new GrinderEntry(720, meldCrystalScattered, with(MeldItems.meldShard, 10)) ); + GrindingQuary.alwaysDump.addAll( + MeldItems.dissonitre, MeldItems.clayMallows, MeldItems.glassMallows, MeldItems.likestoneSediments, MeldItems.meldShard + ); nectar.canStayOn.addAll(mercury, ichor, ooze); mercury.canStayOn.addAll(mercury, ichor, ooze, blood); diff --git a/src/meld/world/blocks/production/GrindingQuary.java b/src/meld/world/blocks/production/GrindingQuary.java index 4b70e54..d67f854 100644 --- a/src/meld/world/blocks/production/GrindingQuary.java +++ b/src/meld/world/blocks/production/GrindingQuary.java @@ -37,6 +37,7 @@ public class GrindingQuary extends Block { public static ObjectMap grinderMap = new ObjectMap<>(); + public static Seq alwaysDump = new Seq<>(); public static ObjectFloatMap drillMultipliers = new ObjectFloatMap<>(); @@ -240,10 +241,21 @@ public void update(){ dumpAccumulate(key); } + alwaysDump.each(this::dumpAccumulate); + progress += Time.delta/itemDuration; if(progress >= 1){ progress %= 1; + + //Get the speed boost from the non optional aspect consumer boostAmount = 1; + + for (Consume consumer : consumers) { + if(!consumer.booster && consumer.efficiency(this) > 0) boostAmount = consumer.efficiencyMultiplier(this); + } + + //Get the speed boost from the non optional aspect consumer + for (Consume consumer : consumers) { if(consumer.booster && consumer.optional && consumer.efficiency(this) > 0) boostAmount *= consumer.efficiencyMultiplier(this); consumer.trigger(this); From 71f2202a02dbe7d07e7f529059774b10f5861eaf Mon Sep 17 00:00:00 2001 From: Sh1p*nfire Date: Wed, 29 Apr 2026 16:14:21 +1000 Subject: [PATCH 08/15] multipliers are working on single beam drill and... yeah --- mod.hjson | 2 +- .../blocks/production/GrindingQuary.java | 1 - .../blocks/production/SingleBeamDrill.java | 31 ++++++++++++++++++- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/mod.hjson b/mod.hjson index 065f64a..3cd6750 100644 --- a/mod.hjson +++ b/mod.hjson @@ -16,7 +16,7 @@ description: "[[]gray]Under scattered gloomy sunlight in the shimmering seas, wi subtitle: "[[]accent]What choice do I have...[[]]" #the mod version -version: gameplay test 5 +version: gameplay test 5.1 #the minimum game build required to run this mod minGameVersion: 157 diff --git a/src/meld/world/blocks/production/GrindingQuary.java b/src/meld/world/blocks/production/GrindingQuary.java index d67f854..8309af1 100644 --- a/src/meld/world/blocks/production/GrindingQuary.java +++ b/src/meld/world/blocks/production/GrindingQuary.java @@ -253,7 +253,6 @@ public void update(){ for (Consume consumer : consumers) { if(!consumer.booster && consumer.efficiency(this) > 0) boostAmount = consumer.efficiencyMultiplier(this); } - //Get the speed boost from the non optional aspect consumer for (Consume consumer : consumers) { diff --git a/src/meld/world/blocks/production/SingleBeamDrill.java b/src/meld/world/blocks/production/SingleBeamDrill.java index f764aa9..ee5386a 100644 --- a/src/meld/world/blocks/production/SingleBeamDrill.java +++ b/src/meld/world/blocks/production/SingleBeamDrill.java @@ -37,6 +37,7 @@ import mindustry.world.Tile; import mindustry.world.blocks.production.BeamDrill; import mindustry.world.blocks.production.Drill; +import mindustry.world.consumers.Consume; import mindustry.world.meta.BlockFlag; import static meld.graphics.TileDrawers.tileRad; @@ -82,6 +83,15 @@ public SingleBeamDrill(String name) { @Override public void drawOverlay(float x, float y, int rotation) { + float multiplier = 1; + + Tile start = Vars.world.tileWorld(x, y); + if(start != null){ + if(Vars.control.input.block == null && start.build instanceof SingleBeamBuild build && start== build.tile && start.block() == this){ + multiplier = build.boostAmount; + } + } + Item found = null; int unusedTiles = range + 1; @@ -111,7 +121,7 @@ public void drawOverlay(float x, float y, int rotation) { if(found != null){ Item current = transformItems.get(found, found); - Draww.itemText(mined/drillTime * 60 + " " + current.localizedName + "/s", x, drawy, current); + Draww.itemText(mined/drillTime * 60 * multiplier+ " " + current.localizedName + "/s", x, drawy, current); if(found != current){ drawy = y - Vars.tilesize * size/2f; float s = iconSmall / 4f; @@ -123,6 +133,13 @@ public void drawOverlay(float x, float y, int rotation) { Draw.rect(found.fullIcon, x - textWidth, drawy, s, s); Draw.rect(current.fullIcon, x + textWidth, drawy, s, s); } + + float drawx = x - (size * Vars.tilesize)/2f - 2; + drawy = y; + + if(multiplier > 1){ + Draww.drawTextUnderlined(multiplier + "x ", drawx, drawy, Pal.accent); + } } else if(other.build != null && other.build.team == Vars.player.team()){ Draww.drawTextUnderlined(Core.bundle.get("overlay.friendly-fire"), x, drawy, Pal.remove); @@ -150,15 +167,27 @@ else if(other.build != null && other.build.team == Vars.player.team()){ public class SingleBeamBuild extends Building{ public float time; + public float boostAmount = 1; @Override public boolean shouldConsume() { return super.shouldConsume() && healthf() >= minHealthf; } + @Override + public float edelta() { + return super.edelta() * boostAmount; + } + @Override public void updateTile() { super.updateTile(); + + boostAmount = 1; + for (Consume consumer : consumers) { + if(consumer.efficiency(this) > 0) boostAmount *= consumer.efficiencyMultiplier(this); + } + if(healthf() >= minHealthf) time += edelta(); if(time >= drillTime){ drill(); From d61b68ca33c103ea95a7ffa345a9d7442faf21dc Mon Sep 17 00:00:00 2001 From: Sh1p*nfire Date: Wed, 29 Apr 2026 18:09:38 +1000 Subject: [PATCH 09/15] spins rapidly --- ...le.shitpost => bundle_shitpost.properties} | 0 src/meld/Meld.java | 2 +- src/meld/core/Bundles.java | 44 +++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) rename assets/bundles/{bundle.shitpost => bundle_shitpost.properties} (100%) create mode 100644 src/meld/core/Bundles.java diff --git a/assets/bundles/bundle.shitpost b/assets/bundles/bundle_shitpost.properties similarity index 100% rename from assets/bundles/bundle.shitpost rename to assets/bundles/bundle_shitpost.properties diff --git a/src/meld/Meld.java b/src/meld/Meld.java index db7b790..6af6c95 100644 --- a/src/meld/Meld.java +++ b/src/meld/Meld.java @@ -34,7 +34,7 @@ public class Meld extends Mod{ public static NativeJavaPackage p = null; public static Melting melting; - + public Meld(){ Events.on(EventType.ClientLoadEvent.class, e -> { MeldRegions.load(); diff --git a/src/meld/core/Bundles.java b/src/meld/core/Bundles.java new file mode 100644 index 0000000..9f11fbb --- /dev/null +++ b/src/meld/core/Bundles.java @@ -0,0 +1,44 @@ +package meld.core; + +import java.util.*; +import arc.*; +import arc.struct.*; +import arc.util.*; +import arc.util.io.*; +import meld.*; +import mindustry.*; +import mindustry.ui.dialogs.*; + +import static arc.Core.*; + +// very hacky dont do this +public final class Bundles{ + private static final Locale locale = new Locale("shitpost"); + + private Bundles(){} + + public static void load(){ + setupLocale(); + loadBundle(); + } + + private static void setupLocale(){ + Vars.locales = new Seq<>(Vars.locales).add(locale).toArray(); + LanguageDialog.displayNames.put(locale.toString(), "Meld Shitpost"); + } + + private static void loadBundle(){ + if(!settings.getString("locale").equals(locale.toString())) return; + Log.info("loading meld shitpost bundle"); + + var modRoot = Vars.mods.getMod(Meld.name).root; + var bundleFile = modRoot.child("bundles").child("bundle_" + locale + ".properties"); + if(!bundleFile.exists()){ + Log.warn("couldn't find shitpost bundle"); + return; + } + + Reflect.set(bundle, "locale", locale); + PropertiesUtils.load(bundle.getProperties(), bundleFile.reader()); + } +} From 0f3238f06936dcf7d1ab143bc84c883f0699f5ff Mon Sep 17 00:00:00 2001 From: Sh1p*nfire Date: Wed, 29 Apr 2026 18:18:53 +1000 Subject: [PATCH 10/15] im so done --- src/meld/Meld.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/meld/Meld.java b/src/meld/Meld.java index 53120fa..bf498c5 100644 --- a/src/meld/Meld.java +++ b/src/meld/Meld.java @@ -53,7 +53,7 @@ public Meld(){ Core.app.post(MeldShaders::load); }); - Events.on(FileTreeInitEvent.class, e -> { + Events.on(EventType.FileTreeInitEvent.class, e -> { // TODO: potentially run earlier? Bundles.load(); }); From 09f52c70bd8807ec46856244bba34cabab760916 Mon Sep 17 00:00:00 2001 From: Sh1p*nfire Date: Wed, 29 Apr 2026 18:43:30 +1000 Subject: [PATCH 11/15] aaaaaaaa awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga awooga raow mrrp mrow arf bark gleeble --- src/meld/Meld.java | 23 ----------- src/meld/graphics/TextModifiers.java | 26 ++++++++++++ src/meld/io/ItemIO.java | 41 +++++++++++++++++++ .../world/blocks/units/UnitLogisticsPad.java | 14 ++++--- 4 files changed, 76 insertions(+), 28 deletions(-) create mode 100644 src/meld/io/ItemIO.java diff --git a/src/meld/Meld.java b/src/meld/Meld.java index bf498c5..96aa947 100644 --- a/src/meld/Meld.java +++ b/src/meld/Meld.java @@ -64,29 +64,6 @@ public Meld(){ public static String prefix(String in){ return name + "-" + in; } - private static final StringBuilder b = new StringBuilder(); - - //Thanks smolkey - public static String gradient(String in, Color... colors){ - if(colors.length == 1) return "[#" + colors[0].toString().substring(0, 6) + "]" + in + "[]"; - - b.setLength(0); - b.trimToSize(); - int length = in.length(); - int spaces = 0; - - for(int i = 0; i < length; i++){ - char ind = in.charAt(i); - if(Character.isWhitespace(ind)){ - spaces++; - b.append(' '); - continue; - } - b.append("[#").append(Tmp.c1.set(colors[0]).lerp(colors, (float) i / (length - spaces)).toString(), 0, 6).append("]").append(ind).append("[]"); - } - - return b.toString(); - } @Override public void init() { diff --git a/src/meld/graphics/TextModifiers.java b/src/meld/graphics/TextModifiers.java index e9cab50..bfc283c 100644 --- a/src/meld/graphics/TextModifiers.java +++ b/src/meld/graphics/TextModifiers.java @@ -1,12 +1,16 @@ package meld.graphics; import arc.Core; +import arc.graphics.Color; import arc.math.Interp; import arc.math.Mathf; import arc.util.Time; +import arc.util.Tmp; public class TextModifiers { + private static final StringBuilder b = new StringBuilder(); + public static char[] glitchChars = new char[]{'-', '=', ',', '&'}; //Modifies the input string @@ -39,4 +43,26 @@ public static String glitchyNumb(float number, float chance, float speed){ public static String glitchyEntry(String input, float edgeMultiplier, float baseChance, float speed){ return glitchy(Core.bundle.get(input), edgeMultiplier, baseChance, speed); } + + //Thanks smolkey + public static String gradient(String in, Color... colors){ + if(colors.length == 1) return "[#" + colors[0].toString().substring(0, 6) + "]" + in + "[]"; + + b.setLength(0); + b.trimToSize(); + int length = in.length(); + int spaces = 0; + + for(int i = 0; i < length; i++){ + char ind = in.charAt(i); + if(Character.isWhitespace(ind)){ + spaces++; + b.append(' '); + continue; + } + b.append("[#").append(Tmp.c1.set(colors[0]).lerp(colors, (float) i / (length - spaces)).toString(), 0, 6).append("]").append(ind).append("[]"); + } + + return b.toString(); + } } diff --git a/src/meld/io/ItemIO.java b/src/meld/io/ItemIO.java new file mode 100644 index 0000000..ef27bec --- /dev/null +++ b/src/meld/io/ItemIO.java @@ -0,0 +1,41 @@ +package meld.io; + +import arc.util.io.Reads; +import arc.util.io.Writes; +import mindustry.Vars; +import mindustry.type.Item; +import mindustry.type.ItemStack; + +//An IO class used to handle item-related input and output +public class ItemIO { + public static void writeStack(Writes write, ItemStack stack){ + write.str(stack.item.name); + write.i(stack.amount); + } + + public static ItemStack readStack(Reads reads){ + return new ItemStack(Vars.content.item(reads.str()), reads.i()); + } + public static void writeStacks(Writes write, ItemStack[] stacks){ + write.i(stacks.length); + for (ItemStack stack: stacks) { + writeStack(write, stack); + } + } + + public static ItemStack[] readStacks(Reads read){ + int size = read.i(); + ItemStack[] items = new ItemStack[size]; + for (int i = 0; i < size; i++) { + items[i] = readStack(read); + } + return items; + } + + public static void writeItem(Writes write, Item item){ + write.str(item == null ? "" : item.name); + } + public static Item readItem(Reads reads){ + return Vars.content.item(reads.str()); + } +} \ No newline at end of file diff --git a/src/meld/world/blocks/units/UnitLogisticsPad.java b/src/meld/world/blocks/units/UnitLogisticsPad.java index 25cd24d..5d1af67 100644 --- a/src/meld/world/blocks/units/UnitLogisticsPad.java +++ b/src/meld/world/blocks/units/UnitLogisticsPad.java @@ -11,6 +11,7 @@ import arc.util.io.*; import arc.util.pooling.Pool.*; import meld.graphics.TileDrawers; +import meld.io.ItemIO; import mindustry.Vars; import mindustry.entities.units.*; import mindustry.gen.*; @@ -58,6 +59,10 @@ public UnitLogisticsPad(String name){ config(Item.class, (UnloadingPadBuild tile, Item item) -> tile.sortItem = item); config(Float.class, (UnloadingPadBuild tile, Float value) -> tile.targetPercent = value); + config(Float[].class, (UnloadingPadBuild tile, Float[] value) -> { + tile.targetPercent = value[0]; + tile.sortItem = content.item(value[1].intValue()); + }); configClear((UnloadingPadBuild tile) -> tile.sortItem = null); } @@ -218,8 +223,8 @@ public void buildConfiguration(Table table){ } @Override - public Item config(){ - return sortItem; + public Float[] config(){ + return new Float[]{targetPercent, (float)sortItem.id}; } @Override @@ -230,7 +235,7 @@ public byte version(){ @Override public void write(Writes write){ super.write(write); - write.i(sortItem == null ? -1 : sortItem.id); + ItemIO.writeItem(write, sortItem); write.f(targetPercent); write.f(unloadTimer); } @@ -238,8 +243,7 @@ public void write(Writes write){ @Override public void read(Reads read, byte revision){ super.read(read, revision); - id = read.i(); - sortItem = id == -1 ? null : content.item(id); + sortItem = ItemIO.readItem(read); targetPercent = read.f(); unloadTimer = read.f(); } From 934fd8c3732077617e9ad0ff36813469c47486fb Mon Sep 17 00:00:00 2001 From: Sh1p*nfire <73347888+Sh1penfire@users.noreply.github.com> Date: Wed, 29 Apr 2026 20:45:19 +1000 Subject: [PATCH 12/15] sometimes my brain just doesn't cooperate with me --- mod.hjson | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod.hjson b/mod.hjson index 3cd6750..345a7e6 100644 --- a/mod.hjson +++ b/mod.hjson @@ -16,7 +16,7 @@ description: "[[]gray]Under scattered gloomy sunlight in the shimmering seas, wi subtitle: "[[]accent]What choice do I have...[[]]" #the mod version -version: gameplay test 5.1 +version: gameplay test 6 #the minimum game build required to run this mod minGameVersion: 157 From 8f9e50caa57dbbb1689403fff41b594a8c9c426a Mon Sep 17 00:00:00 2001 From: Sh1p*nfire Date: Sun, 3 May 2026 15:21:14 +1000 Subject: [PATCH 13/15] why do I tell myself im going to take a break when I don't... --- assets/bundles/bundle.properties | 19 ++++++++++++++++++- assets/bundles/bundle_shitpost.properties | 13 ++++++++----- src/meld/content/MeldBlocks.java | 8 +++++--- src/meld/content/MeldUnits.java | 2 ++ src/meld/graphics/MeldLightRenderer.java | 8 +------- src/meld/graphics/MeldPal.java | 6 +++--- src/meld/world/blocks/production/Depot.java | 2 +- 7 files changed, 38 insertions(+), 20 deletions(-) diff --git a/assets/bundles/bundle.properties b/assets/bundles/bundle.properties index f0e853b..0a3836c 100644 --- a/assets/bundles/bundle.properties +++ b/assets/bundles/bundle.properties @@ -627,7 +627,7 @@ item.meld2-tenbris.details = Fume infused hematite, more malleable and less brit item.meld2-motis.name = Motis item.meld2-motis.description = Raw material, valued for its natural magnetism. -item.meld2-motis.details = Fume infused magnetite, more malleable and less brittle but less hard than usual. +item.meld2-motis.details = Both motis and motus are valid spellings for this material. The correct pronunciation, however, is "mottes".\n\nThank god I took those linguistics classes... item.meld2-shadesteel.name = Shadesteel item.meld2-shadesteel.description = Not just some rock anymore.\nDurable building material. @@ -653,6 +653,20 @@ item.meld2-annealed-silver.name = Annealed Silver item.meld2-annealed-silver.description = Highly refined and attuned. Makes for a great aspect conductor. item.meld2-annealed-silver.details = An easily made aspect superconductor. + +item.meld2-vitali.name = Vitali +item.meld2-vitali.description = A component of Blood, and the primary material in Shadesteel. +item.meld2-vitali.details = Many attempts have been made to make Vitali into something more durable and flexible than Shadesteel. + +item.meld2-limmeri.name = Limmeri +item.meld2-limmeri.description = A lightweight, silvery metal. +item.meld2-limmeri.details = Mixes of Limmeri & Fume-bound Vitali have been used as a source of heat.\n\nIgniting Limmeri's passion for connection with a Pyro containing aspect allows it to steal the Fumes from the Vitali, scorching the air and ground around itself. + +item.meld2-mallum.name = Mallum +item.meld2-mallum.description = A dull, but flexible metal. Resistant to worldly corrosion, yet easily decayed by the aspects.\n\nGreat for soldering aplication. +item.meld2-mallum.details = + + item.meld2-iampsi.name = Iampsi item.meld2-iampsi.description = Hardy mineral found accumulating in deposits under dried riverbeds, or as spikes above surface.\n\nDecomposable for Silver and Quartz Strata, useful for grinding. item.meld2-iampsi.details = Radiance. @@ -1349,6 +1363,9 @@ sectors.underattack.nodamage = [accent]In Progress... status.disarmed.name = Disarmed +database-category.lamp-psi = Lamp Psi +database-tag.lamp-psi = Iamp Psl + database-category.aspect = Aspecti database-tag.aspect-powergen = Potential/Power family database-tag.aspect-omnipotence = Progress diff --git a/assets/bundles/bundle_shitpost.properties b/assets/bundles/bundle_shitpost.properties index b28ca18..1d77138 100644 --- a/assets/bundles/bundle_shitpost.properties +++ b/assets/bundles/bundle_shitpost.properties @@ -14,8 +14,10 @@ block.meld2-pressure-vent.name = Amogus Escape route block.meld2-crystal-cracker.name = Tasty Wafer block.meld2-crystal-cracker.description = ...you know you wana\n\njust a lil nibble -block.meld2-overflow-chute.name = Smart Router -block.meld2-overflow-chute.description = Smart Router +block.meld2-aspect-channel.name = BetterConduit + +block.meld2-chute-overflow.name = Smart Router +block.meld2-chute-overflow.description = Smart Router block.meld2-depot.name = frankouloadertainer's frankouloadertainer-er @@ -23,7 +25,8 @@ liquid.meld2-aspect.name = Outdated Ass Destroyer liquid.meld2-storming-aspect.name = Bombspect liquid.meld2-bound-aspect.name = Leanspect -unit.meld-bulbhead.name = Bulbster -unit.meld-bulbhead.description = Meldieps the allied blocks as it Meldarras.io the enemies +unit.meld2-bulbhead.name = Bulbster +unit.meld2-bulbhead.description = Meldieps the allied blocks as it Meldarras.io the enemies -liquid.meld2-meld = Meld 2: Electric meldaloo \ No newline at end of file +liquid.meld2-meld.name = Meld 2: Electric meldaloo +liquid.meld2-meld.description = (the same) \ No newline at end of file diff --git a/src/meld/content/MeldBlocks.java b/src/meld/content/MeldBlocks.java index 312ecf0..a7c5a4b 100644 --- a/src/meld/content/MeldBlocks.java +++ b/src/meld/content/MeldBlocks.java @@ -1535,7 +1535,7 @@ Category.production, with( outputLiquidSlots = 1; inputLiquids.addAll(MeldLiquids.aspect, MeldLiquids.boundAspect, MeldLiquids.stormingAspect); - inputItems.addAll(MeldItems.tenbris, MeldItems.clayMallows, MeldItems.carbolith, MeldItems.debris, MeldItems.shadesteel, MeldItems.glassMallows, MeldItems.silver, MeldItems.likestoneSediments, MeldItems.quartzStrata); + inputItems.addAll(MeldItems.tenbris, MeldItems.clayMallows, MeldItems.carbolith, MeldItems.debris, MeldItems.shadesteel, MeldItems.silver, MeldItems.likestoneSediments, MeldItems.quartzStrata); outputItems.addAll(MeldItems.cruciblePlating, MeldItems.shadesteel, MeldItems.glassMallows, MeldItems.annealedSilver); outputLiquids.addAll(MeldLiquids.fumes); @@ -1933,6 +1933,8 @@ Category.production, with( requirements(Category.effect, with(MeldItems.iampsi, 30)); configurable = false; radius = 32; + databaseCategory = "lamp-psi"; + databaseTag = "lamp-psi"; consume(new StupidConsumeAspects(outletRate/5, AspectGroup.aspect)); }}; @@ -1967,7 +1969,7 @@ Category.production, with( platedChute = new Duct("plated-chute"){{ requirements(Category.distribution, with(MeldItems.cruciblePlating, 2)); armored = true; - health = 45; + health = 70; armor = 10; speed = 4f; }}; @@ -2472,7 +2474,7 @@ Category.production, with( meldCannon, meldMortar, craigCoffer, jillaCoffer, braigCoffer, billaCoffer, meldCultivator, - pipebox, pipelineBridge, pipelineCrossing, pipelineRouter, + pipeline, pipelineBridge, pipelineCrossing, pipelineRouter, carbonicBarrier, carbonicBarrierLarge, crystalBarrier, crystalBarrierLarge, meldAmplifier, meldCapsule, meldNode, meldSuppressor ); diff --git a/src/meld/content/MeldUnits.java b/src/meld/content/MeldUnits.java index eea9851..7852c79 100644 --- a/src/meld/content/MeldUnits.java +++ b/src/meld/content/MeldUnits.java @@ -129,6 +129,7 @@ public static void load(){ bulbheadOverseer = new UnitType("bulbhead-overseer"){{ float IR = 80; + itemCapacity = 0; health = 240; armor = -40; lifetime = 360; @@ -637,6 +638,7 @@ public static void load(){ cannonOverseer = new MeldUnitType("cannon-overseer"){{ float IR = 120; + itemCapacity = 0; health = 800; lifetime = 360 * 6; speed = 0; diff --git a/src/meld/graphics/MeldLightRenderer.java b/src/meld/graphics/MeldLightRenderer.java index 9d8667e..bb02ccf 100644 --- a/src/meld/graphics/MeldLightRenderer.java +++ b/src/meld/graphics/MeldLightRenderer.java @@ -229,7 +229,6 @@ public void draw2(){ Draw.color(); buffer.begin(Color.clear); Draw.sort(false); - Gl.blendEquationSeparate(Gl.funcAdd, Gl.max); Blending.additive.apply(); for(Runnable run : lights){ run.run(); @@ -240,8 +239,6 @@ public void draw2(){ Draw.rect(circleRegion, cir.x, cir.y, cir.radius * 2, cir.radius * 2); } Draw.reset(); - Blending.normal.apply(); - Draw.sort(true); Texture lightTex = buffer.getTexture(); buffer.end(); Draw.color(); @@ -249,9 +246,6 @@ public void draw2(){ //TODO: potential memory leak Draw.color(); shadowBuffer.begin(Color.clear); - Draw.sort(false); - Blending.additive.apply(); - Gl.blendEquationSeparate(Gl.funcAdd, Gl.funcAdd); shadowBuffer.resize(Core.graphics.getWidth()/scaling, Core.graphics.getHeight()/scaling); for(Runnable run : shadows){ @@ -259,10 +253,10 @@ public void draw2(){ } Draw.reset(); - Blending.normal.apply(); Draw.sort(true); Texture exclusionTex = shadowBuffer.getTexture(); shadowBuffer.end(); + Blending.normal.apply(); Draw.color(); diff --git a/src/meld/graphics/MeldPal.java b/src/meld/graphics/MeldPal.java index 2eb0d02..de8dc32 100644 --- a/src/meld/graphics/MeldPal.java +++ b/src/meld/graphics/MeldPal.java @@ -6,9 +6,9 @@ public class MeldPal { public static Color - meldFloorGlow = Color.valueOf("d26ab12b"), - meldFloorGlowDeep = Color.valueOf("ca3fba21"), - meldFloorGlowHadal = Color.valueOf("ca3fba1b"), + meldFloorGlow = Color.valueOf("d26ab1").a(0.3f), + meldFloorGlowDeep = Color.valueOf("ca3fba").a(0.15f), + meldFloorGlowHadal = Color.valueOf("ca3fba").a(0.10f), aspect = Color.valueOf("f0f5fe"), diff --git a/src/meld/world/blocks/production/Depot.java b/src/meld/world/blocks/production/Depot.java index 876cd31..3d3b4fd 100644 --- a/src/meld/world/blocks/production/Depot.java +++ b/src/meld/world/blocks/production/Depot.java @@ -78,7 +78,7 @@ public void updateTile(){ if(lastItem == null && items.any()){ //branching just for the sake of my sanity here if(sortItem == null || sortItem == items.first()) lastItem = items.first(); - else lastItem = sortItem; + else if(items.has(sortItem)) lastItem = sortItem; } if(lastItem != null){ From a6d2597c0421604824654275c021a5b83eff49db Mon Sep 17 00:00:00 2001 From: Sh1p*nfire Date: Tue, 5 May 2026 02:53:21 +1000 Subject: [PATCH 14/15] Truely additive lights, removed an unescecary additive blending call --- src/meld/Meld.java | 3 --- src/meld/graphics/MeldLightRenderer.java | 6 ++++-- src/meld/graphics/MeldPal.java | 6 +++--- src/meld/graphics/MeldShaders.java | 3 +++ src/meld/graphics/part/SonarPart.java | 2 -- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/meld/Meld.java b/src/meld/Meld.java index 96aa947..22f7721 100644 --- a/src/meld/Meld.java +++ b/src/meld/Meld.java @@ -44,9 +44,6 @@ public Meld(){ Events.run(EventType.Trigger.draw, () -> { if(!MeldSettings.overlayOverFog) return; Draw.draw(Layer.fogOfWar + 2, AboveOverlayRenderer::draw); - - //Just additive blending the fuck out of this layer in particular cause like fuck yes - Draw.drawRange(MeldLayers.smokeHigh, 1, () -> Draw.blend(Blending.additive), () -> Draw.blend(Blending.normal)); }); Events.on(EventType.FileTreeInitEvent.class, e -> { diff --git a/src/meld/graphics/MeldLightRenderer.java b/src/meld/graphics/MeldLightRenderer.java index bb02ccf..cf56808 100644 --- a/src/meld/graphics/MeldLightRenderer.java +++ b/src/meld/graphics/MeldLightRenderer.java @@ -211,6 +211,7 @@ public boolean enabled(){ } public void draw(){ + draw2(); } public void draw2(){ @@ -229,7 +230,8 @@ public void draw2(){ Draw.color(); buffer.begin(Color.clear); Draw.sort(false); - Blending.additive.apply(); + Draw.blend(Blending.additive); + for(Runnable run : lights){ run.run(); } @@ -256,7 +258,7 @@ public void draw2(){ Draw.sort(true); Texture exclusionTex = shadowBuffer.getTexture(); shadowBuffer.end(); - Blending.normal.apply(); + Draw.blend(Blending.normal); Draw.color(); diff --git a/src/meld/graphics/MeldPal.java b/src/meld/graphics/MeldPal.java index de8dc32..4ab3dac 100644 --- a/src/meld/graphics/MeldPal.java +++ b/src/meld/graphics/MeldPal.java @@ -6,9 +6,9 @@ public class MeldPal { public static Color - meldFloorGlow = Color.valueOf("d26ab1").a(0.3f), - meldFloorGlowDeep = Color.valueOf("ca3fba").a(0.15f), - meldFloorGlowHadal = Color.valueOf("ca3fba").a(0.10f), + meldFloorGlow = Color.valueOf("d26ab1").a(0.1f), + meldFloorGlowDeep = Color.valueOf("ca3fba").a(0.05f), + meldFloorGlowHadal = Color.valueOf("ca3fba").a(0.02f), aspect = Color.valueOf("f0f5fe"), diff --git a/src/meld/graphics/MeldShaders.java b/src/meld/graphics/MeldShaders.java index 976c189..399a469 100644 --- a/src/meld/graphics/MeldShaders.java +++ b/src/meld/graphics/MeldShaders.java @@ -51,10 +51,13 @@ public static void load(){ Draw.draw(Layer.background, () -> { lightBuffer.begin(); }); + /* Draw.draw(Layer.light, () -> { lightBuffer.end(); MeldLightRenderer.thingo.draw2(); }); + + */ } Draw.drawRange(MeldLayers.sonar, 0.1f, () -> { diff --git a/src/meld/graphics/part/SonarPart.java b/src/meld/graphics/part/SonarPart.java index 43b0c3f..aa9ec53 100644 --- a/src/meld/graphics/part/SonarPart.java +++ b/src/meld/graphics/part/SonarPart.java @@ -46,9 +46,7 @@ public void draw(PartParams params) { Vec2 pos = new Vec2(Tmp.v1); Vars.renderer.lights.add(() -> { - Draw.blend(Blending.additive); Fill.light(pos.x, pos.y, 100, radius, Pal.accent, MeldPal.accentClear); - Draw.blend(Blending.normal); }); } } From 22652625959f889a24ef4ac87466e55aa0bfe08a Mon Sep 17 00:00:00 2001 From: Sh1p*nfire Date: Tue, 5 May 2026 02:55:32 +1000 Subject: [PATCH 15/15] Fixed quarries consuming despite no space, -Extruders can crush things now -Bezerk Ability removes the slowdown from impaled -Adjusted lights on bulbhead/some liquids to be less hard -aspect outlets no longer output based on framerate, whoopsies! --- assets/bundles/bundle.properties | 2 +- assets/shaders/light.frag | 9 +++--- assets/shaders/sonar.frag | 2 +- src/meld/Meld.java | 2 +- src/meld/content/MeldBlocks.java | 11 +++++--- src/meld/content/MeldLiquids.java | 19 ++++++++++--- src/meld/content/MeldRecipes.java | 15 ++++++++++ src/meld/content/MeldStatusEffects.java | 2 +- src/meld/content/MeldUnits.java | 6 ++-- .../unit/abilities/BezerkAbility.java | 2 +- .../abilities/FabricatorBatteryAbility.java | 2 +- src/meld/fluid/Aspect.java | 1 + src/meld/graphics/MeldLayers.java | 1 + src/meld/graphics/MeldPal.java | 1 + src/meld/graphics/MeldShaders.java | 9 ------ src/meld/graphics/part/SonarPart.java | 2 +- src/meld/ui/MeldSettings.java | 28 ------------------- .../world/blocks/fluid/VisualAspectPipe.java | 16 +++++++++-- .../world/blocks/producer/ProduceLiquid.java | 3 +- src/meld/world/blocks/production/Depot.java | 6 +++- .../blocks/production/GrindingQuary.java | 2 +- 21 files changed, 78 insertions(+), 63 deletions(-) diff --git a/assets/bundles/bundle.properties b/assets/bundles/bundle.properties index 0a3836c..fa20dfb 100644 --- a/assets/bundles/bundle.properties +++ b/assets/bundles/bundle.properties @@ -42,7 +42,7 @@ block.meld2-rotary-kiln.name = Rotary Kiln block.meld2-rotary-kiln.description = Burns mass amounts of [#cbdbfc]Aspect[] as fuel, heats materials to process them in bulk.\n\n[accent]Carbolith + Tenbris -> Shadesteel + [#5b4739]Fumes[]\nSilver -> Annealed Silver\n\nClay-Mallows + Quartz Strata + Likestone Sediments -> Glassy-Mallows\n\nClay-Mallows + Likestone Sediments + Debris -> Crucible-Plating\nDebris + Shadesteel -> Crucible Platings block.meld2-pneumatic-extruder.name = Pneumatic Extruder -block.meld2-pneumatic-extruder.description = Extrudes material into pipes and capsules, uses [#cbdbfc]Aspect[] to run. [accent]\n\nDebris + Elnar -> Aspect Pipe\n\nSilver/Annealed Silver + Debris -> Aspect Pipe\n\nGlassy-Mallows + Silver/Annealed Silver + Storming Aspect -> [red]Aspect Bombs[] +block.meld2-pneumatic-extruder.description = Extrudes material into pipes and capsules, uses [#cbdbfc]Aspect[] to run.\n\nCan process crushing recipies but at a far reduced rate.\n\n[accent]\n\nDebris + Elnar -> Aspect Pipe\n\nSilver/Annealed Silver + Debris -> Aspect Pipe\n\nGlassy-Mallows + Silver/Annealed Silver + Storming Aspect -> [red]Aspect Bombs[] block.meld2-storm-iris.name = Storm Iris block.meld2-storm-iris.description = Converts stable [meld2-aether]Aether[] into charged [meld2-thundering-aether]Thundering Aether[] diff --git a/assets/shaders/light.frag b/assets/shaders/light.frag index c117372..1c0a218 100644 --- a/assets/shaders/light.frag +++ b/assets/shaders/light.frag @@ -9,9 +9,10 @@ uniform vec4 u_ambient; varying vec2 v_texCoords; -void main(){ +#define banding 8.0 +#define banding2 3.0 - float banding = 8.0; +void main(){ //Exclusion vec4 exclusion = texture2D(u_exclusion, v_texCoords); @@ -24,9 +25,9 @@ void main(){ float alpha = color.a; //Get the scaling right here... - alpha = clamp(floor((alpha) * 8.0)/8.0, 0.0, 1.0) * 0.3 + clamp(floor(alpha * 3.0)/3.0, 0.0, 1.0) * 0.3 + alpha * 0.4; + alpha = clamp(floor((alpha) * banding)/banding, 0.0, 1.0) * 0.3 + clamp(floor(alpha * banding2)/banding2, 0.0, 1.0) * 0.3 + alpha * 0.4; - vec4 totalColor = clamp(vec4(color.rgb * alpha, 1) + vec4(positionAmbient.rgb * positionAmbient.a, 1), 0.0, 1.0); + vec4 totalColor = clamp(vec4(color.rgb * alpha, 1.0) + vec4(positionAmbient.rgb * positionAmbient.a, 1.0), 0.0, 1.0); vec4 background = clamp(texture2D(u_texture, v_texCoords), 0.0, 1.0); diff --git a/assets/shaders/sonar.frag b/assets/shaders/sonar.frag index dec4079..e67b533 100644 --- a/assets/shaders/sonar.frag +++ b/assets/shaders/sonar.frag @@ -14,7 +14,7 @@ void main() { vec4 color = texture2D(u_texture, v_texCoords); gl_FragColor = color; - if(color.r == 1 && color.g + color.b > 0){ + if(color.r == 1.0 && color.g + color.b > 0.0){ color.a *= 0.5 * abs(sin((v_texCoords.x + v_texCoords.y) * 20.0 + u_time/20.0)); diff --git a/src/meld/Meld.java b/src/meld/Meld.java index 22f7721..87c04d2 100644 --- a/src/meld/Meld.java +++ b/src/meld/Meld.java @@ -43,7 +43,7 @@ public Meld(){ Events.run(EventType.Trigger.draw, () -> { if(!MeldSettings.overlayOverFog) return; - Draw.draw(Layer.fogOfWar + 2, AboveOverlayRenderer::draw); + Draw.draw(MeldLayers.overlayOver, AboveOverlayRenderer::draw); }); Events.on(EventType.FileTreeInitEvent.class, e -> { diff --git a/src/meld/content/MeldBlocks.java b/src/meld/content/MeldBlocks.java index a7c5a4b..4ac49ea 100644 --- a/src/meld/content/MeldBlocks.java +++ b/src/meld/content/MeldBlocks.java @@ -1202,7 +1202,7 @@ public void update(Bullet b){ size = 2; health = 800; - itemCapacity = 20; + itemCapacity = 50; }}; aspectIncinerator = new StorageIncinerator("aspect-incinerator"){{ @@ -1269,7 +1269,7 @@ public void update(Bullet b){ health = 420; placeableLiquid = true; - drillTime = 90; + drillTime = 180; tier = 2; buildTime = 90; @@ -1553,8 +1553,8 @@ Category.production, with( itemCapacity = 10; inputLiquids.addAll(MeldLiquids.aspect, MeldLiquids.boundAspect, MeldLiquids.stormingAspect); - inputItems.addAll(MeldItems.shadesteel, MeldItems.elnarDust, MeldItems.debris, MeldItems.silver, MeldItems.annealedSilver, MeldItems.glassMallows); - outputItems.addAll(MeldItems.aspectPipe, MeldItems.aspectBomb); + inputItems.addAll(MeldItems.shadesteel, MeldItems.elnarDust, MeldItems.debris, MeldItems.silver, MeldItems.annealedSilver, MeldItems.glassMallows, MeldItems.iampsi); + outputItems.addAll(MeldItems.aspectPipe, MeldItems.aspectBomb, MeldItems.quartzStrata); inputLiquidSlots = 1; @@ -1606,6 +1606,9 @@ Category.production, with( ); }} ); + recipes.addAll( + MeldRecipes.crusherRecipies(2, 0.25f) + ); }}; crushWeaver = new AttributeCrafter("crush-weaver"){{ diff --git a/src/meld/content/MeldLiquids.java b/src/meld/content/MeldLiquids.java index 7802521..36cc61b 100644 --- a/src/meld/content/MeldLiquids.java +++ b/src/meld/content/MeldLiquids.java @@ -6,6 +6,7 @@ import arc.struct.Seq; import meld.fluid.Aspect; import meld.fluid.AspectGroup; +import meld.graphics.MeldPal; import mindustry.entities.effect.ParticleEffect; import mindustry.type.CellLiquid; import mindustry.type.Liquid; @@ -31,37 +32,46 @@ public static void load(){ aether = new Aspect("aether"){{ gas = true; color = Color.valueOf("cb8650"); + lightColor = Color.valueOf("412a0c").a(0.5f); + lightOpacity = 0.01f; temperature = 0.6f; }}; pollutantMixture = new Aspect("pollutant-mixture"){{ gas = true; - color = Color.valueOf("6a634d"); temperature = 0.6f; + + color = Color.valueOf("6a634d"); + lightOpacity = 0.001f; }}; thunderingAether = new Aspect("thundering-aether"){{ gas = true; - color = Color.valueOf("f35430"); temperature = 0.6f; explosiveness = 0.1f; + + color = Color.valueOf("f35430"); + lightOpacity = 0.02f; }}; aspect = new Aspect("aspect"){{ gas = true; flammability = 0.35f; explosiveness = 1; - color = Color.valueOf("cbdbfc"); temperature = 0.6f; + + color = Color.valueOf("cbdbfc"); + lightOpacity = 0.02f; }}; stormingAspect = new Aspect("storming-aspect"){{ gas = true; - color = Color.valueOf("aaadfd"); temperature = 0.6f; flammability = 1; explosiveness = 2; + color = Color.valueOf("aaadfd"); + lightOpacity = 0.05f; }}; boundAspect = new Aspect("bound-aspect"){{ @@ -73,6 +83,7 @@ public static void load(){ meld = new Aspect("meld"){{ gas = true; color = Color.valueOf("e4aad5"); + lightColor = MeldPal.meldFloorGlow; temperature = 0.6f; }}; diff --git a/src/meld/content/MeldRecipes.java b/src/meld/content/MeldRecipes.java index 3ca3b4f..6be57fb 100644 --- a/src/meld/content/MeldRecipes.java +++ b/src/meld/content/MeldRecipes.java @@ -64,4 +64,19 @@ public static Seq kilnRecipies(float outlets, float speedMultiplier }} ); } + + //All crushing recipies + public static Seq crusherRecipies(float outlets, float speedMultiplier){ + return Seq.with( + new TimedRecipe(15/speedMultiplier){{ + consumers.addAll( + new ConsumeItems(with(MeldItems.iampsi, 1)), + new StupidConsumeAspects(outletRate * outlets, AspectGroup.aspect) + ); + producers.addAll( + new ProduceItem(new ItemStack(MeldItems.quartzStrata, 3)) + ); + }} + ); + } } diff --git a/src/meld/content/MeldStatusEffects.java b/src/meld/content/MeldStatusEffects.java index 218925a..1769575 100644 --- a/src/meld/content/MeldStatusEffects.java +++ b/src/meld/content/MeldStatusEffects.java @@ -248,7 +248,7 @@ public void update(Unit unit, StatusEntry entry) { impaled = new StatusEffect("impaled"){{ damage = 1f; - speedMultiplier = 0.45f; + speedMultiplier = 0.65f; buildSpeedMultiplier = 0.5f; }}; diff --git a/src/meld/content/MeldUnits.java b/src/meld/content/MeldUnits.java index 7852c79..d0d245a 100644 --- a/src/meld/content/MeldUnits.java +++ b/src/meld/content/MeldUnits.java @@ -290,11 +290,13 @@ public static void load(){ range = 100; - lightRadius = IR/2; + lightRadius = IR * 2; lightOpacity = 0.5f; + lightColor = Color.orange; buildSpeed = 1; mineTier = 2; mineSpeed = 8; + itemCapacity = 100; buildBeamOffset = 9; rotateToBuilding = false; @@ -870,7 +872,7 @@ public static void load(){ health = 200; armor = 45; - drownTimeMultiplier = 0.6f; + drownTimeMultiplier = 0.25f; drag = 0.14f; accel = 0.24f; diff --git a/src/meld/entities/unit/abilities/BezerkAbility.java b/src/meld/entities/unit/abilities/BezerkAbility.java index 368b933..02f9e03 100644 --- a/src/meld/entities/unit/abilities/BezerkAbility.java +++ b/src/meld/entities/unit/abilities/BezerkAbility.java @@ -56,7 +56,7 @@ public class BezerkAbility extends Ability { public Seq sedated = new Seq<>(); public BezerkAbility(){ - clear.add(MeldStatusEffects.sentry); + clear.add(MeldStatusEffects.sentry, MeldStatusEffects.impaled); sedated.addAll(MeldStatusEffects.lacerated); } diff --git a/src/meld/entities/unit/abilities/FabricatorBatteryAbility.java b/src/meld/entities/unit/abilities/FabricatorBatteryAbility.java index 58007e2..fe2f052 100644 --- a/src/meld/entities/unit/abilities/FabricatorBatteryAbility.java +++ b/src/meld/entities/unit/abilities/FabricatorBatteryAbility.java @@ -174,7 +174,7 @@ public void draw(Unit unit) { Draw.rect(MeldRegions.chargeRegions[stage], dx - x * 2, dy); Vars.renderer.lights.add(() -> { - Fill.light(unit.x, unit.y, 4 + (int) lightRadius/4, lightRadius, Tmp.c1.set(unit.type.lightColor).a(1), Tmp.c2.set(unit.type.lightColor).a(0)); + Fill.light(unit.x, unit.y, 4 + (int) lightRadius/4, lightRadius, Tmp.c1.set(unit.type.lightColor).a((float) stage/stageMax * 0.5f), Tmp.c2.set(unit.type.lightColor).a(0)); }); } } diff --git a/src/meld/fluid/Aspect.java b/src/meld/fluid/Aspect.java index 70c6674..5954e86 100644 --- a/src/meld/fluid/Aspect.java +++ b/src/meld/fluid/Aspect.java @@ -12,6 +12,7 @@ public class Aspect extends Liquid { public boolean setDefaults = true; + //Opacity per liquid unit in a block public float lightOpacity = 0.5f; public Aspect(String name) { diff --git a/src/meld/graphics/MeldLayers.java b/src/meld/graphics/MeldLayers.java index 8525355..a514861 100644 --- a/src/meld/graphics/MeldLayers.java +++ b/src/meld/graphics/MeldLayers.java @@ -8,6 +8,7 @@ public class MeldLayers { funnyNumber = 0.691337f, smokeLow = 50 + funnyNumber, smokeHigh = 105 + funnyNumber, + overlayOver = Layer.fogOfWar + 2 + funnyNumber, sonar = Layer.fogOfWar + 1 + funnyNumber, sonarInside = Layer.fogOfWar + 3 + funnyNumber; } diff --git a/src/meld/graphics/MeldPal.java b/src/meld/graphics/MeldPal.java index 4ab3dac..c1b61d1 100644 --- a/src/meld/graphics/MeldPal.java +++ b/src/meld/graphics/MeldPal.java @@ -6,6 +6,7 @@ public class MeldPal { public static Color + //VERY low opacity since pools overlap with their light radius meldFloorGlow = Color.valueOf("d26ab1").a(0.1f), meldFloorGlowDeep = Color.valueOf("ca3fba").a(0.05f), meldFloorGlowHadal = Color.valueOf("ca3fba").a(0.02f), diff --git a/src/meld/graphics/MeldShaders.java b/src/meld/graphics/MeldShaders.java index 399a469..4eccdc2 100644 --- a/src/meld/graphics/MeldShaders.java +++ b/src/meld/graphics/MeldShaders.java @@ -41,8 +41,6 @@ public static void load(){ sonar = new SonarShader("sonar"); light = new LightShaderMeld("light"); - - Events.run(EventType.Trigger.draw, () -> { sonarBuffer.resize(Core.graphics.getWidth(), Core.graphics.getHeight()); @@ -51,13 +49,6 @@ public static void load(){ Draw.draw(Layer.background, () -> { lightBuffer.begin(); }); - /* - Draw.draw(Layer.light, () -> { - lightBuffer.end(); - MeldLightRenderer.thingo.draw2(); - }); - - */ } Draw.drawRange(MeldLayers.sonar, 0.1f, () -> { diff --git a/src/meld/graphics/part/SonarPart.java b/src/meld/graphics/part/SonarPart.java index aa9ec53..b1e40d1 100644 --- a/src/meld/graphics/part/SonarPart.java +++ b/src/meld/graphics/part/SonarPart.java @@ -46,7 +46,7 @@ public void draw(PartParams params) { Vec2 pos = new Vec2(Tmp.v1); Vars.renderer.lights.add(() -> { - Fill.light(pos.x, pos.y, 100, radius, Pal.accent, MeldPal.accentClear); + Fill.light(pos.x, pos.y, 100, radius, Tmp.c1.set(Pal.accent).a(0.1f), MeldPal.accentClear); }); } } diff --git a/src/meld/ui/MeldSettings.java b/src/meld/ui/MeldSettings.java index 9ecccb0..322efd6 100644 --- a/src/meld/ui/MeldSettings.java +++ b/src/meld/ui/MeldSettings.java @@ -75,34 +75,6 @@ public static void loadSettings(){ check(t, SettingKeys.bulbheadOmnimove, false, MeldUnits::bulbheadOmnimove); check(t, SettingKeys.portSaves, false, b -> portSaves = b); }); - - /* - photosensitiveMode = Core.settings.getBool("settings.frostscape-flashing-lights-safety", false); - heatOverlay.enabled = Core.settings.getBool("settings.frostscape-heat-overlay", false); - simplifiedLightning = Core.settings.getBool("settings.frostscape-simple-lightning"); - parallax = Core.settings.getInt("settings.frostscape-parallax"); - - heatOverlay.enabled = Core.settings.getBool("settings.frostscape-heat-overlay", false); - ui.settings.addCategory(Core.bundle.get("settings.frostscape-title"), NAME + "-hunter", t -> { - t.sliderPref(Core.bundle.get("settings.frostscape-parallax"), 100, 1, 100, 1, s -> { - parallax = s/100; - return s + "%"; - }); - t.sliderPref(Core.bundle.get("settings.frostscape-wind-visual-force"), 1, 0, 8, 1, s -> s * 100 + "%"); - t.checkPref(Core.bundle.get("settings.frostscape-flashing-lights-safety"), false, b -> { - photosensitiveMode = b; - }); - t.checkPref(Core.bundle.get("settings.frostscape-heat-overlay"), false, b -> { - heatOverlay.enabled = b; - }); - t.checkPref(Core.bundle.get("settings.frostscape-simple-lightning"), false, b -> { - simplifiedLightning = b; - }); - t.row(); - t.add(Core.bundle.get("settings.frostscape.flashingwarning")).wrap().left().growX().padTop(3); - }); - - */ } } diff --git a/src/meld/world/blocks/fluid/VisualAspectPipe.java b/src/meld/world/blocks/fluid/VisualAspectPipe.java index 8319871..9b3699d 100644 --- a/src/meld/world/blocks/fluid/VisualAspectPipe.java +++ b/src/meld/world/blocks/fluid/VisualAspectPipe.java @@ -1,6 +1,7 @@ package meld.world.blocks.fluid; import arc.graphics.Blending; +import arc.graphics.Color; import arc.graphics.g2d.Draw; import arc.graphics.g2d.Fill; import arc.graphics.g2d.TextureRegion; @@ -250,9 +251,20 @@ public void drawInbetween(){ ); } } + } + Draw.blend(); + Draw.reset(); + } - Draw.blend(); - Draw.reset(); + @Override + public void drawLiquidLight(Liquid liquid, float amount) { + if (amount > 0.01F) { + Color color = liquid.lightColor; + float fract = 1.0f; + float opacity = color.a * fract; + if (opacity > 0.001F) { + Drawf.light(this.x, this.y, (float)this.block.size * 30.0F * fract, color, opacity * amount); + } } } } diff --git a/src/meld/world/blocks/producer/ProduceLiquid.java b/src/meld/world/blocks/producer/ProduceLiquid.java index 81b74c7..05f043c 100644 --- a/src/meld/world/blocks/producer/ProduceLiquid.java +++ b/src/meld/world/blocks/producer/ProduceLiquid.java @@ -1,6 +1,7 @@ package meld.world.blocks.producer; import arc.math.Mathf; +import arc.util.Time; import mindustry.gen.Building; import mindustry.type.ItemStack; import mindustry.type.Liquid; @@ -28,6 +29,6 @@ public float efficiency(Building build) { @Override public void update(Building build) { super.update(build); - build.handleLiquid(build, output.liquid, output.amount); + build.handleLiquid(build, output.liquid, output.amount * Time.delta); } } diff --git a/src/meld/world/blocks/production/Depot.java b/src/meld/world/blocks/production/Depot.java index 3d3b4fd..7525563 100644 --- a/src/meld/world/blocks/production/Depot.java +++ b/src/meld/world/blocks/production/Depot.java @@ -72,6 +72,10 @@ public Item config(){ return sortItem; } + @Override + public boolean acceptItem(Building source, Item item) { + return (sortItem == item || sortItem == null) && items.get(item) < getMaximumAccepted(item); + } @Override public void updateTile(){ @@ -85,7 +89,7 @@ public void updateTile(){ time += 1f / speed * delta(); Building target = getTileTarget(lastItem, lastInput, false); - if(target != null && (time >= 1f || !(target.block instanceof Router || target.block.instantTransfer))){ + if(target != null && (time >= 1f || !(target.block instanceof Depot || target.block.instantTransfer))){ getTileTarget(lastItem, lastInput, true); target.handleItem(this, lastItem); items.remove(lastItem, 1); diff --git a/src/meld/world/blocks/production/GrindingQuary.java b/src/meld/world/blocks/production/GrindingQuary.java index 8309af1..b603f73 100644 --- a/src/meld/world/blocks/production/GrindingQuary.java +++ b/src/meld/world/blocks/production/GrindingQuary.java @@ -229,7 +229,7 @@ public boolean shouldConsume() { for (Item key : itemRates.keys()) { if(itemRates.get(key, 0) * drillMultipliers.get(key, 1) > 0 && acceptItem(this, key)) return true; } - return target != null; + return target != null && ItemLogic.capacity(entry.output, this); } @Override