diff --git a/assets/bundles/bundle.properties b/assets/bundles/bundle.properties index 65671d6..70a7b99 100644 --- a/assets/bundles/bundle.properties +++ b/assets/bundles/bundle.properties @@ -304,12 +304,16 @@ block.meld-pad-phi.name = Pad: Phi block.meld-pad-phi.description = Outpost of the base. Only one can be active at a time.\n[red]Cannot support a base alone.[] block.meld-pad-phi.details = Golden ratio? What's that? +block.meld-aspect-incinerator.name = Aspect Incinerator +block.meld-aspect-incinerator.description = Incinerates items when fed [meld-aspect]Aspect[].\n\nBuffers items otherwise. +block.meld-aspect-incinerator.details = Shoulda been named output terminal or smthing + block.meld-core-raft-dormant.name = Core: Raft[lightgray](Dormant)[] block.meld-core-raft-dormant.description = Core of the base. Allows units to pass through freely. [accent]Activates when inside a powered facility.[] block.meld-core-raft-dormant.details = Cheap bunker with intra-sector item transport and radar built in. block.meld-core-raft.name = Core: Raft -block.meld-core-raft.description = Core of the base. Allows units to pass through freely. Once all are destroyed, the sector is lost. +block.meld-core-raft.description = Core of the base. Allows units to pass through freely. Once all are destroyed, the sector is lost.\n\n[accent]Requires an adjacent incinerator to void excess items.[] block.meld-core-raft.details = A great logistics hub. Equipped with single-use launch thrusters. block.meld-core-bunker.name = Core: Bunker diff --git a/assets/sprites/blocks/effect/aspect-incinerator-liquid.png b/assets/sprites/blocks/effect/aspect-incinerator-liquid.png new file mode 100644 index 0000000..7e085ef Binary files /dev/null and b/assets/sprites/blocks/effect/aspect-incinerator-liquid.png differ diff --git a/assets/sprites/blocks/effect/aspect-incinerator-top.png b/assets/sprites/blocks/effect/aspect-incinerator-top.png new file mode 100644 index 0000000..dbcf478 Binary files /dev/null and b/assets/sprites/blocks/effect/aspect-incinerator-top.png differ diff --git a/assets/sprites/blocks/effect/aspect-incinerator.png b/assets/sprites/blocks/effect/aspect-incinerator.png new file mode 100644 index 0000000..5716a41 Binary files /dev/null and b/assets/sprites/blocks/effect/aspect-incinerator.png differ diff --git a/mod.hjson b/mod.hjson index 6ca2d3f..dadda92 100644 --- a/mod.hjson +++ b/mod.hjson @@ -14,7 +14,7 @@ main: "meld.Meld" description: "Meld Java.\n\n[[]accent]Only has custom game content! (play the info map to understand)[[]]\n\nIncompatable with hjson meld" #the mod version -version: gameplay expirimental v3 +version: gameplay expirimental v4 #the minimum game build required to run this mod minGameVersion: 154 diff --git a/src/meld/Meld.java b/src/meld/Meld.java index c78ca77..3b39f84 100644 --- a/src/meld/Meld.java +++ b/src/meld/Meld.java @@ -50,6 +50,7 @@ public static String prefix(String 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 + "[]"; diff --git a/src/meld/content/MeldBlocks.java b/src/meld/content/MeldBlocks.java index 1bd4e98..2eefbfd 100644 --- a/src/meld/content/MeldBlocks.java +++ b/src/meld/content/MeldBlocks.java @@ -18,6 +18,7 @@ import meld.world.blocks.consumers.StupidConsumeAspects; import meld.world.blocks.crafting.ModularCrafter; import meld.world.blocks.crafting.RecipeCrafter; +import meld.world.blocks.crafting.StorageIncinerator; import meld.world.blocks.crafting.recipe.ItemRecipe; import meld.world.blocks.crafting.recipe.SpoolRecipe; import meld.world.blocks.crafting.modules.*; @@ -29,6 +30,7 @@ import meld.world.blocks.production.SingleBeamDrill; import meld.world.meta.*; import mindustry.Vars; +import mindustry.content.Blocks; import mindustry.content.Fx; import mindustry.content.StatusEffects; import mindustry.entities.bullet.*; @@ -80,7 +82,14 @@ public class MeldBlocks { //Suture shoots healing needles in a cone at the closest damaged block. Impales enemies, causing them to take constant chip damage and be sedated. bruisekit, gauze, suture; - public static Block coreRaft, aetherAccumulator, elementalBlaster, pneumaticPulsear, + //Core Blocks + public static Block coreRaft; + + //Core Incinerator does what core incinerator does... it core incinerator + + public static ItemIncinerator aspectIncinerator; + + public static Block aetherAccumulator, elementalBlaster, pneumaticPulsear, earthboundInfuser, fumehood, sharkFactory; public static ModularCrafter gasKiln, rotaryKiln, pneumaticExtruder; @@ -999,8 +1008,7 @@ public void update(Bullet b){ consume(new ConsumeAspects(outletRate/2, MeldLiquids.aspectEfficiencies, MeldLiquids.aspectDensities)); }}; - coreRaft = new CoreRaft("core-raft"){ - { + coreRaft = new CoreRaft("core-raft"){{ requirements(Category.effect, with( MeldItems.debris, 900 )); @@ -1012,7 +1020,16 @@ public void update(Bullet b){ unitCapModifier = 6; unitType = MeldUnits.bulbhead; - solid = true; + solid = false; + }}; + + aspectIncinerator = new StorageIncinerator("aspect-incinerator"){{ + requirements(Category.effect, with(MeldItems.debris, 40)); + health = 120; + liquidCapacity = 10; + itemCapacity = 10; + + consume(new StupidConsumeAspects(outletRate/10, AspectGroup.aspect)); }}; aetherAccumulator = new AttributeCrafter("aether-accumulator"){{ @@ -1088,9 +1105,19 @@ public void update(Bullet b){ optionalBoostIntensity = 2; - consume(new ConsumeAspects( - outletRate, MeldLiquids.aspectEfficiencies, MeldLiquids.aspectDensities - )); + drillMultipliers.put( + MeldItems.clayMallows, 0.5f + ); + drillMultipliers.put( + MeldItems.resonarum, 0.5f + ); + + consume(new StupidConsumeAspects( + outletRate, AspectGroup.aspect + ){{ + optional = booster = false; + }} + ); consume(new ConsumeLiquid( MeldLiquids.meld, 1 @@ -1610,7 +1637,7 @@ public void update(Bullet b){ carbonicBarrier = new Wall("stone-blocker"){{ requirements(Category.defense, with(MeldItems.stonyParticulate, 15)); - health = 400; + health = 650; armor = 85; customShadow = true; @@ -1621,7 +1648,7 @@ public void update(Bullet b){ carbonicBarrierLarge = new Wall("stone-blocker-large"){{ requirements(Category.defense, with(MeldItems.stonyParticulate, 60)); size = 2; - health = 400; + health = 2600; armor = 85; customShadow = true; @@ -1666,6 +1693,8 @@ public void update(Bullet b){ liquidCapacity = 100; liquidPressure = 4; range = 8; + + ((Conduit) pipeline).rotBridgeReplacement = this; }}; meldCultivator = new AttributeCrafter("meld-cultivator"){{ diff --git a/src/meld/entities/unit/BulbheadEntity.java b/src/meld/entities/unit/BulbheadEntity.java index 7d6fcee..fb29658 100644 --- a/src/meld/entities/unit/BulbheadEntity.java +++ b/src/meld/entities/unit/BulbheadEntity.java @@ -49,11 +49,7 @@ public class BulbheadEntity extends UnitWaterMove { public EntityCollisions.SolidPred solidity() { return (x, y) -> { Tile tile = Vars.world.tile(x, y); - if(tile == null) return true; - - if(tile.synthetic() || !tile.solid()) return false; - - return !(tile.floor().isLiquid); + return tile == null || tile.solid(); }; } diff --git a/src/meld/entities/unit/abilities/BezerkAbility.java b/src/meld/entities/unit/abilities/BezerkAbility.java index ca6448a..368b933 100644 --- a/src/meld/entities/unit/abilities/BezerkAbility.java +++ b/src/meld/entities/unit/abilities/BezerkAbility.java @@ -109,7 +109,6 @@ public void update(Unit unit) { public void death(Unit unit) { if(bezerk && deathBomb != null) { deathBomb.create(null, unit.team, unit.x, unit.y, unit.vel.angle()); - Log.info("boomies!"); } super.death(unit); } diff --git a/src/meld/world/WorldUtil.java b/src/meld/world/WorldUtil.java index 6eabd8d..e4f2daf 100644 --- a/src/meld/world/WorldUtil.java +++ b/src/meld/world/WorldUtil.java @@ -1,10 +1,12 @@ package meld.world; +import arc.func.Cons; import arc.math.Mathf; import arc.math.geom.Point2; import arc.struct.Seq; import arc.util.Nullable; import arc.util.Tmp; +import mindustry.world.Block; import mindustry.world.Tile; import mindustry.world.meta.Attribute; @@ -23,6 +25,10 @@ public static float sumAttribute(@Nullable Attribute attr, int x, int y){ return tempTiles.sumf(other -> other.floor().attributes.get(attr)); } + public static void nearbyTiles(float x, float y, int size, Cons cons){ + Tmp.v1.set(size, (size - 1)/2f); + } + //Just to note //Rotation 0/0: (1, 0) //Rotation 90/1: (0, 1) diff --git a/src/meld/world/blocks/Bruisekit.java b/src/meld/world/blocks/Bruisekit.java index ce14483..c07fa71 100644 --- a/src/meld/world/blocks/Bruisekit.java +++ b/src/meld/world/blocks/Bruisekit.java @@ -29,7 +29,7 @@ public class BruisekitBuild extends PulsarBuild{ @Override public boolean shouldConsume() { - return super.shouldConsume() && target != null && lastRadius < range; + return super.shouldConsume() && (target != null || Math.abs(smoothRadius - range) > 1); } @Override @@ -42,8 +42,6 @@ public void updateTile() { if(target.wasRecentlyDamaged()) healAmount *= recentDamageMultiplier; if(target.block.size == 0) healAmount *= smallMultiplier; - Log.info(healAmount); - target.heal(healAmount); } } diff --git a/src/meld/world/blocks/CoreRaft.java b/src/meld/world/blocks/CoreRaft.java index a1218f1..1903f71 100644 --- a/src/meld/world/blocks/CoreRaft.java +++ b/src/meld/world/blocks/CoreRaft.java @@ -8,6 +8,7 @@ import arc.util.Nullable; import arc.util.Time; import meld.content.MeldStatusEffects; +import meld.world.blocks.crafting.StorageIncinerator; import mindustry.Vars; import mindustry.content.Fx; import mindustry.entities.Units; @@ -16,14 +17,20 @@ import mindustry.game.Team; import mindustry.gen.Building; import mindustry.gen.Player; +import mindustry.gen.Teamc; import mindustry.gen.Unit; import mindustry.graphics.Layer; import mindustry.graphics.Pal; +import mindustry.type.Item; import mindustry.type.UnitType; import mindustry.world.Tile; +import mindustry.world.blocks.production.Incinerator; +import mindustry.world.blocks.production.ItemIncinerator; +import mindustry.world.blocks.production.WallCrafter; import mindustry.world.blocks.storage.CoreBlock; -import static mindustry.Vars.tilesize; +import static mindustry.Vars.*; +import static mindustry.Vars.net; //Rallies units nearby, provides an extended build radius for core units @@ -103,6 +110,23 @@ public class CoreRaftBuild extends CoreBuild { public @Nullable Tile targetTile; public boolean building = false, lastBuilding = false; + public Building incinerator; + + public boolean canIncinerate = false; + + @Override + public void onProximityUpdate() { + super.onProximityUpdate(); + incinerator= null; + proximity.each(b -> { + if(b instanceof Incinerator.IncineratorBuild || + b instanceof ItemIncinerator.ItemIncineratorBuild || + b.block instanceof StorageIncinerator + ) incinerator = b; + }); + canIncinerate = incinerator != null; + } + @Override public void onRemoved() { super.onRemoved(); @@ -115,6 +139,57 @@ public Building init(Tile tile, Team team, boolean shouldAdd, int rotation) { return super.init(tile, team, shouldAdd, rotation); } + @Override + public boolean acceptItem(Building source, Item item){ + return items.get(item) < getMaximumAccepted(item) || canIncinerate && incinerator.acceptItem(source, item); + } + + @Override + public int getMaximumAccepted(Item item){ + return canIncinerate ? incinerator.getMaximumAccepted(item) : storageCapacity; + } + + @Override + public void handleStack(Item item, int amount, Teamc source){ + boolean incinerate = canIncinerate && incinerateNonBuildable && !item.buildable; + int realAmount = incinerate ? 0 : Math.min(amount, storageCapacity - items.get(item)); + super.handleStack(item, realAmount, source); + + if(team == state.rules.defaultTeam && state.isCampaign()){ + if(!incinerate){ + state.rules.sector.info.handleCoreItem(item, amount); + } + + if(realAmount == 0 && wasVisible && canIncinerate){ + incinerator.handleStack(item, amount, source); + } + } + } + + @Override + public void handleItem(Building source, Item item){ + boolean incinerate = incinerateNonBuildable && !item.buildable; + + if(team == state.rules.defaultTeam){ + state.stats.coreItemCount.increment(item); + } + + if(net.server() || !net.active()){ + if(team == state.rules.defaultTeam && state.isCampaign() && !incinerate){ + state.rules.sector.info.handleCoreItem(item, 1); + } + + if(items.get(item) >= storageCapacity || incinerate){ + //create item incineration effect at random intervals + incinerator.handleItem(source, item); + }else{ + super.handleItem(source, item); + } + }else if(((state.rules.coreIncinerates && canIncinerate && items.get(item) >= storageCapacity) || incinerate) && !noEffect){ + incinerator.handleItem(source, item); + } + } + @Override public void updateTile() { super.updateTile(); diff --git a/src/meld/world/blocks/FieldPulsar.java b/src/meld/world/blocks/FieldPulsar.java index aa2da94..aefbccd 100644 --- a/src/meld/world/blocks/FieldPulsar.java +++ b/src/meld/world/blocks/FieldPulsar.java @@ -75,7 +75,6 @@ public class PulsarBuild extends Building{ public float smoothRadius; public float duration, uptime, grace; - public float lastRadius = 0f; @Override public void update() { diff --git a/src/meld/world/blocks/LiquidUtil.java b/src/meld/world/blocks/LiquidUtil.java index 2312a46..0a8a98e 100644 --- a/src/meld/world/blocks/LiquidUtil.java +++ b/src/meld/world/blocks/LiquidUtil.java @@ -16,7 +16,7 @@ public static boolean hasAll(LiquidStack[] liquids, Building build){ public static boolean has(LiquidStack[] liquids, Building build){ for(LiquidStack stack: liquids){ - if(build.liquids.get(stack.liquid) <= 0) { + if(build.liquids.get(stack.liquid) < stack.amount) { return false; } } diff --git a/src/meld/world/blocks/SonarSpire.java b/src/meld/world/blocks/SonarSpire.java index d50a7c0..43e9cee 100644 --- a/src/meld/world/blocks/SonarSpire.java +++ b/src/meld/world/blocks/SonarSpire.java @@ -24,6 +24,8 @@ public SonarSpire(String name) { } public class SonarSpireBuild extends PulsarBuild { + public float lastRadius = 0f; + @Override public void updateTile() { super.updateTile(); @@ -41,7 +43,7 @@ public void updateTile() { } @Override public float fogRadius() { - return smoothRadius/ tilesize; + return smoothRadius/tilesize; } @Override diff --git a/src/meld/world/blocks/crafting/StorageIncinerator.java b/src/meld/world/blocks/crafting/StorageIncinerator.java new file mode 100644 index 0000000..9bf13e4 --- /dev/null +++ b/src/meld/world/blocks/crafting/StorageIncinerator.java @@ -0,0 +1,65 @@ +package meld.world.blocks.crafting; + +import arc.graphics.g2d.Draw; +import arc.graphics.g2d.TextureRegion; +import arc.math.Mathf; +import mindustry.gen.Building; +import mindustry.graphics.Drawf; +import mindustry.type.Item; +import mindustry.world.blocks.production.ItemIncinerator; +import mindustry.world.meta.BlockStatus; + +public class StorageIncinerator extends ItemIncinerator { + public StorageIncinerator(String name) { + super(name); + hasItems = true; + hasLiquids = true; + } + + @Override + public TextureRegion[] icons(){ + return new TextureRegion[]{region, topRegion}; + } + + public class ItemIncineratorBuild extends Building { + + @Override + public void updateTile(){ + } + + @Override + public BlockStatus status(){ + return !enabled ? BlockStatus.logicDisable : efficiency > 0 ? BlockStatus.active : BlockStatus.noInput; + } + + @Override + public void draw(){ + super.draw(); + + if(liquidRegion.found()){ + Drawf.liquid(liquidRegion, x, y, liquids.currentAmount() / liquidCapacity, liquids.current().color); + } + if(topRegion.found()){ + Draw.rect(topRegion, x, y); + } + } + + @Override + public void handleItem(Building source, Item item){ + if(efficiency > 0){ + if(Mathf.chance(effectChance)) effect.at(x, y); + } + else super.handleItem(source, item); + } + + @Override + public boolean acceptItem(Building source, Item item){ + return items.get(item) < itemCapacity || efficiency > 0; + } + + @Override + public int getMaximumAccepted(Item item) { + return efficiency > 0 ? Integer.MAX_VALUE/2 : Mathf.clamp(itemCapacity - items.get(item), 0, itemCapacity); + } + } +} diff --git a/src/meld/world/blocks/fluid/AspectPipe.java b/src/meld/world/blocks/fluid/AspectPipe.java index 95d2502..b54c801 100644 --- a/src/meld/world/blocks/fluid/AspectPipe.java +++ b/src/meld/world/blocks/fluid/AspectPipe.java @@ -5,6 +5,7 @@ import arc.struct.Seq; import arc.util.Log; import meld.content.MeldLiquids; +import meld.world.blocks.crafting.ModularCrafter; import meld.world.blocks.crafting.RecipeCrafter; import mindustry.Vars; import mindustry.game.Team; @@ -50,7 +51,7 @@ public void updateTile() { //get the tile above and below the current pipe, accounting for rotation Tile t = Vars.world.tile(tile.x + Geometry.d4(1 + i * 2 + rotation).x, tile.y + Geometry.d4(1 + i * 2 + rotation).y); - if(t == null || t.build == null || !t.build.block.hasLiquids || t.build.liquids == null || (!(t.build.block instanceof RecipeCrafter) && t.build.block.consumers.length == 0)) continue; + if(t == null || t.build == null || !t.build.block.hasLiquids || t.build.liquids == null || (!(t.build.block instanceof RecipeCrafter || t.build.block instanceof ModularCrafter) && t.build.block.consumers.length == 0)) continue; moveLiquid(t.build, liquids.current()); } diff --git a/src/meld/world/blocks/fluid/ChannelDirector.java b/src/meld/world/blocks/fluid/ChannelDirector.java index 9367148..9ab1f48 100644 --- a/src/meld/world/blocks/fluid/ChannelDirector.java +++ b/src/meld/world/blocks/fluid/ChannelDirector.java @@ -20,13 +20,14 @@ public ChannelDirector(String name) { super(name); rotate = true; quickRotate = true; + solid = false; } public class DirectorBuild extends FlexibleBuild{ @Override public Building getLiquidDestination(Building source, Liquid liquid, Position otherOffset) { - int dir = WorldUtil.relativeTo(source.tile.x, source.tile.y, tile.x, tile.y); + int dir = source.tile.relativeTo(tile); if(!acceptDirection(source, this, dir)) return this; return super.getLiquidDestination(source, liquid, otherOffset); diff --git a/src/meld/world/blocks/fluid/FlexibleSizeJunction.java b/src/meld/world/blocks/fluid/FlexibleSizeJunction.java index d66b1f0..fa20f0f 100644 --- a/src/meld/world/blocks/fluid/FlexibleSizeJunction.java +++ b/src/meld/world/blocks/fluid/FlexibleSizeJunction.java @@ -47,7 +47,8 @@ public Building getLiquidDestination(Building source, Liquid liquid, Position ot if(!enabled && enabledToggles) return this; //Find which direction the offset should go - int dir = WorldUtil.relativeTo(source.tile.x, source.tile.y, tile.x, tile.y); + int dir = source.relativeTo(tile); + Point2 direction = Geometry.d4(dir); //Direction offset vector diff --git a/src/meld/world/blocks/fluid/VisualAspectPipe.java b/src/meld/world/blocks/fluid/VisualAspectPipe.java index 03096d9..8319871 100644 --- a/src/meld/world/blocks/fluid/VisualAspectPipe.java +++ b/src/meld/world/blocks/fluid/VisualAspectPipe.java @@ -15,6 +15,7 @@ import arc.util.Tmp; import meld.content.MeldFx; import mindustry.Vars; +import mindustry.game.EventType; import mindustry.gen.Building; import mindustry.graphics.Drawf; import mindustry.graphics.Layer; diff --git a/src/meld/world/blocks/producer/Produce.java b/src/meld/world/blocks/producer/Produce.java new file mode 100644 index 0000000..15476b0 --- /dev/null +++ b/src/meld/world/blocks/producer/Produce.java @@ -0,0 +1,4 @@ +package meld.world.blocks.producer; + +public class Produce { +}