diff --git a/core/assets-raw/sprites/units/locus-cell.png b/core/assets-raw/sprites/units/locus-cell.png new file mode 100644 index 0000000000..673f589670 Binary files /dev/null and b/core/assets-raw/sprites/units/locus-cell.png differ diff --git a/core/assets-raw/sprites/units/locus-weapon-cell.png b/core/assets-raw/sprites/units/locus-weapon-cell.png new file mode 100644 index 0000000000..3ba48d74e2 Binary files /dev/null and b/core/assets-raw/sprites/units/locus-weapon-cell.png differ diff --git a/core/assets-raw/sprites/units/locus-weapon.png b/core/assets-raw/sprites/units/locus-weapon.png index f349a25b87..bb426746dd 100644 Binary files a/core/assets-raw/sprites/units/locus-weapon.png and b/core/assets-raw/sprites/units/locus-weapon.png differ diff --git a/core/assets/icons/icons.properties b/core/assets/icons/icons.properties index 9237ae8fa7..bcd0c14056 100755 --- a/core/assets/icons/icons.properties +++ b/core/assets/icons/icons.properties @@ -545,3 +545,5 @@ 63158=fabricator|block-fabricator-ui 63157=stell|unit-stell-ui 63156=ore-beryllium|block-ore-beryllium-ui +63155=locus|unit-locus-ui +63154=avert|unit-avert-ui diff --git a/core/assets/logicids.dat b/core/assets/logicids.dat index 332785ba54..9c4e7b2120 100644 Binary files a/core/assets/logicids.dat and b/core/assets/logicids.dat differ diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 228649624f..fc2c057fa8 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -996,10 +996,9 @@ public class Blocks{ consumeItems(with(Items.copper, 3, Items.lead, 4, Items.titanium, 2, Items.silicon, 3)); }}; - cryofluidMixer = new LiquidConverter("cryofluid-mixer"){{ + cryofluidMixer = new GenericCrafter("cryofluid-mixer"){{ requirements(Category.crafting, with(Items.lead, 65, Items.silicon, 40, Items.titanium, 60)); - outputLiquid = new LiquidStack(Liquids.cryofluid, 0.2f); - craftTime = 120f; + outputLiquid = new LiquidStack(Liquids.cryofluid, 12f / 60f); size = 2; hasPower = true; hasItems = true; @@ -1012,7 +1011,7 @@ public class Blocks{ consumePower(1f); consumeItem(Items.titanium); - consumeLiquid(Liquids.water, 0.2f); + consumeLiquid(Liquids.water, 12f / 60f); }}; pyratiteMixer = new GenericCrafter("pyratite-mixer"){{ @@ -1043,8 +1042,8 @@ public class Blocks{ melter = new GenericCrafter("melter"){{ requirements(Category.crafting, with(Items.copper, 30, Items.lead, 35, Items.graphite, 45)); health = 200; - outputLiquid = new LiquidStack(Liquids.slag, 2f); - craftTime = 10f; + outputLiquid = new LiquidStack(Liquids.slag, 12f / 60f); + craftTime = 1f; hasLiquids = hasPower = true; drawer = new DrawLiquid(){{ liquidDrawn = Liquids.slag; @@ -1091,8 +1090,7 @@ public class Blocks{ sporePress = new GenericCrafter("spore-press"){{ requirements(Category.crafting, with(Items.lead, 35, Items.silicon, 30)); liquidCapacity = 60f; - craftTime = 20f; - outputLiquid = new LiquidStack(Liquids.oil, 6f); + outputLiquid = new LiquidStack(Liquids.oil, 18f / 60f); size = 2; health = 320; hasLiquids = true; @@ -1177,7 +1175,6 @@ public class Blocks{ drawer.iconOverride = new String[]{"-bottom", ""}; regionRotated1 = 3; - continuousLiquidOutput = true; outputLiquids = LiquidStack.with(Liquids.ozone, 4f / 60, Liquids.hydrogen, 6f / 60); liquidOutputDirections = new int[]{1, 3}; }}; @@ -1185,7 +1182,6 @@ public class Blocks{ atmosphericConcentrator = new HeatCrafter("atmospheric-concentrator"){{ requirements(Category.crafting, with(Items.oxide, 60, Items.beryllium, 180, Items.silicon, 150)); size = 3; - continuousLiquidOutput = true; hasLiquids = true; drawer = new DrawMulti(new DrawRegion("-bottom"), new DrawLiquidTile(Liquids.nitrogen, 4.1f), new DrawBlock(), new DrawHeatInput(), @@ -1318,7 +1314,6 @@ public class Blocks{ craftTime = 60f * 2f; - continuousLiquidOutput = true; outputLiquid = new LiquidStack(Liquids.gallium, 1f / 60f); outputItem = new ItemStack(Items.scrap, 1); }}; @@ -1385,8 +1380,7 @@ public class Blocks{ size = 3; liquidCapacity = 40f; - outputLiquid = new LiquidStack(Liquids.cyanogen, 3f); - craftTime = 60f * 1f; + outputLiquid = new LiquidStack(Liquids.cyanogen, 3f / 60f); consumeLiquids(LiquidStack.with(Liquids.hydrogen, 3f / 60f, Liquids.nitrogen, 2f / 60f)); consumeItem(Items.graphite); @@ -2185,13 +2179,18 @@ public class Blocks{ scaledHealth = 130; }}; - combustionGenerator = new BurnerGenerator("combustion-generator"){{ + combustionGenerator = new ConsumeGenerator("combustion-generator"){{ requirements(Category.power, with(Items.copper, 25, Items.lead, 15)); powerProduction = 1f; itemDuration = 120f; ambientSound = Sounds.smelter; ambientSoundVolume = 0.03f; + + consume(new ConsumeItemFlammable()); + consume(new ConsumeItemExplode()); + + drawer = new DrawMulti(new DrawBlock(), new DrawWarmupRegion()); }}; thermalGenerator = new ThermalGenerator("thermal-generator"){{ @@ -2205,7 +2204,7 @@ public class Blocks{ ambientSoundVolume = 0.06f; }}; - steamGenerator = new BurnerGenerator("steam-generator"){{ + steamGenerator = new ConsumeGenerator("steam-generator"){{ requirements(Category.power, with(Items.copper, 35, Items.graphite, 25, Items.lead, 40, Items.silicon, 30)); powerProduction = 5.5f; itemDuration = 90f; @@ -2216,6 +2215,11 @@ public class Blocks{ ambientSound = Sounds.smelter; ambientSoundVolume = 0.06f; + + consume(new ConsumeItemFlammable()); + consume(new ConsumeItemExplode()); + + drawer = new DrawMulti(new DrawBlock(), new DrawWarmupRegion(), new DrawTurbines()); }}; differentialGenerator = new ConsumeGenerator("differential-generator"){{ @@ -2234,11 +2238,15 @@ public class Blocks{ consumeLiquid(Liquids.cryofluid, 0.1f); }}; - rtgGenerator = new DecayGenerator("rtg-generator"){{ + rtgGenerator = new ConsumeGenerator("rtg-generator"){{ requirements(Category.power, with(Items.lead, 100, Items.silicon, 75, Items.phaseFabric, 25, Items.plastanium, 75, Items.thorium, 50)); size = 2; powerProduction = 4.5f; itemDuration = 60 * 14f; + envEnabled = Env.any; + + drawer = new DrawMulti(new DrawBlock(), new DrawWarmupRegion()); + consume(new ConsumeItemRadioactive()); }}; solarPanel = new SolarGenerator("solar-panel"){{ @@ -2260,8 +2268,10 @@ public class Blocks{ health = 700; itemDuration = 360f; powerProduction = 15f; - consumeItem(Items.thorium); heating = 0.02f; + + consumeItem(Items.thorium); + //TODO how to non update consumeLiquid(Liquids.cryofluid, heating / coolantPower).update(false); }}; @@ -2479,7 +2489,6 @@ public class Blocks{ ambientSound = Sounds.hum; ambientSoundVolume = 0.06f; hasLiquids = true; - continuousLiquidOutput = true; boostScale = 1f / 9f; outputLiquid = new LiquidStack(Liquids.water, 30f / 60f); consumePower(0.5f); diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index 74a16604d0..0d995693ab 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -73,7 +73,7 @@ public class UnitTypes{ public static @EntityDef({Unitc.class, BuildingTetherc.class, Payloadc.class}) UnitType manifold, assemblyDrone, effectDrone; //tank - public static @EntityDef({Unitc.class, Tankc.class}) UnitType stell, vanquish, conquer; + public static @EntityDef({Unitc.class, Tankc.class}) UnitType stell, locus, vanquish, conquer; //endregion @@ -2457,6 +2457,47 @@ public class UnitTypes{ }}); }}; + locus = new TankUnitType("locus"){{ + hitSize = 18f; + treadPullOffset = 5; + speed = 0.7f; + rotateSpeed = 3f; + health = 800; + armor = 7f; + areaDamage = 8f; + treadRects = new Rect[]{new Rect(17, 10, 19, 76)}; + researchCostMultiplier = 0f; + + weapons.add(new Weapon("locus-weapon"){{ + layerOffset = 0.0001f; + reload = 70f; + shootY = 8f; + recoil = 1f; + rotate = true; + rotateSpeed = 1.4f; + mirror = false; + x = 0f; + y = 0f; + heatColor = Color.valueOf("f9350f"); + cooldownTime = 30f; + + bullet = new BasicBulletType(5f, 50){{ + sprite = "missile-large"; + smokeEffect = Fx.shootBigSmoke; + shootEffect = Fx.shootBigColor; + width = 5f; + height = 7f; + lifetime = 40f; + hitSize = 4f; + hitColor = backColor = trailColor = Color.valueOf("feb380"); + frontColor = Color.white; + trailWidth = 1.7f; + trailLength = 5; + despawnEffect = hitEffect = Fx.hitBulletColor; + }}; + }}); + }}; + vanquish = new TankUnitType("vanquish"){{ hitSize = 28f; treadPullOffset = 4; diff --git a/core/src/mindustry/entities/comp/BuildingComp.java b/core/src/mindustry/entities/comp/BuildingComp.java index ce908627b1..f4c6c380eb 100644 --- a/core/src/mindustry/entities/comp/BuildingComp.java +++ b/core/src/mindustry/entities/comp/BuildingComp.java @@ -80,7 +80,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, public transient float healSuppressionTime = -1f; public transient float lastHealTime = -120f * 10f; - private transient boolean consValid, consOptionalValid; + private transient boolean consValid; private transient float timeScale = 1f, timeScaleDuration; private transient float dumpAccum; @@ -460,10 +460,6 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, return consValid && enabled && shouldConsume(); } - public boolean consOptionalValid(){ - return consValid() && consOptionalValid; - } - public void consume(){ for(Consume cons : block.consumers){ cons.trigger(self()); @@ -1621,18 +1617,15 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, public void updateConsumption(){ //everything is valid when cheating if(cheating()){ - consValid = consOptionalValid = true; + consValid = true; return; } boolean prevValid = consValid(); consValid = true; - consOptionalValid = true; boolean docons = shouldConsume() && productionValid(); - for(Consume cons : block.consumers){ - if(cons.optional) continue; - + for(Consume cons : block.nonOptionalConsumers){ if(docons && cons.update && prevValid && cons.valid(self())){ cons.update(self()); } @@ -1644,8 +1637,6 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, if(docons && cons.update && prevValid && cons.valid(self())){ cons.update(self()); } - - consOptionalValid &= cons.valid(self()); } } diff --git a/core/src/mindustry/mod/ClassMap.java b/core/src/mindustry/mod/ClassMap.java index 252a66d8d9..04eb40877f 100644 --- a/core/src/mindustry/mod/ClassMap.java +++ b/core/src/mindustry/mod/ClassMap.java @@ -297,17 +297,12 @@ public class ClassMap{ classes.put("BatteryBuild", mindustry.world.blocks.power.Battery.BatteryBuild.class); classes.put("BeamNode", mindustry.world.blocks.power.BeamNode.class); classes.put("BeamNodeBuild", mindustry.world.blocks.power.BeamNode.BeamNodeBuild.class); - classes.put("BurnerGenerator", mindustry.world.blocks.power.BurnerGenerator.class); - classes.put("BurnerGeneratorBuild", mindustry.world.blocks.power.BurnerGenerator.BurnerGeneratorBuild.class); classes.put("ConditionalConsumePower", ConsumePowerCondition.class); classes.put("ConsumeGenerator", mindustry.world.blocks.power.ConsumeGenerator.class); classes.put("ConsumeGeneratorBuild", mindustry.world.blocks.power.ConsumeGenerator.ConsumeGeneratorBuild.class); - classes.put("DecayGenerator", mindustry.world.blocks.power.DecayGenerator.class); classes.put("DynamicConsumePower", ConsumePowerDynamic.class); classes.put("ImpactReactor", mindustry.world.blocks.power.ImpactReactor.class); classes.put("ImpactReactorBuild", mindustry.world.blocks.power.ImpactReactor.ImpactReactorBuild.class); - classes.put("ItemLiquidGenerator", mindustry.world.blocks.power.ItemLiquidGenerator.class); - classes.put("ItemLiquidGeneratorBuild", mindustry.world.blocks.power.ItemLiquidGenerator.ItemLiquidGeneratorBuild.class); classes.put("LightBlock", mindustry.world.blocks.power.LightBlock.class); classes.put("LightBuild", mindustry.world.blocks.power.LightBlock.LightBuild.class); classes.put("LongPowerNode", mindustry.world.blocks.power.LongPowerNode.class); diff --git a/core/src/mindustry/type/Weapon.java b/core/src/mindustry/type/Weapon.java index 9ff3cef80d..3f775aed23 100644 --- a/core/src/mindustry/type/Weapon.java +++ b/core/src/mindustry/type/Weapon.java @@ -119,6 +119,8 @@ public class Weapon implements Cloneable{ public TextureRegion region; /** heat region, must be same size as region (optional) */ public TextureRegion heatRegion; + /** cell region, must be same size as region (optional) */ + public TextureRegion cellRegion; /** outline region to display if top is false */ public TextureRegion outlineRegion; /** heat region tint */ @@ -209,6 +211,12 @@ public class Weapon implements Cloneable{ Draw.rect(region, wx, wy, weaponRotation); + if(cellRegion.found()){ + Draw.color(unit.type.cellColor(unit)); + Draw.rect(cellRegion, wx, wy, weaponRotation); + Draw.color(); + } + if(heatRegion.found() && mount.heat > 0){ Draw.color(heatColor, mount.heat); Draw.blend(Blending.additive); @@ -475,6 +483,7 @@ public class Weapon implements Cloneable{ public void load(){ region = Core.atlas.find(name); heatRegion = Core.atlas.find(name + "-heat"); + cellRegion = Core.atlas.find(name + "-cell"); outlineRegion = Core.atlas.find(name + "-outline"); //TODO outlinedRegions diff --git a/core/src/mindustry/world/Block.java b/core/src/mindustry/world/Block.java index a89752e0de..126d616937 100644 --- a/core/src/mindustry/world/Block.java +++ b/core/src/mindustry/world/Block.java @@ -303,7 +303,7 @@ public class Block extends UnlockableContent implements Senseable{ /** Consumption filters. */ public boolean[] itemFilter, liquidFilter; /** Array of consumers used by this block. Only populated after init(). */ - public Consume[] consumers = {}, optionalConsumers = {}; + public Consume[] consumers = {}, optionalConsumers = {}, nonOptionalConsumers = {}; /** Set to true if this block has any consumers in its array. */ public boolean hasConsumers; /** The single power consumer, if applicable. */ @@ -1090,7 +1090,8 @@ public class Block extends UnlockableContent implements Senseable{ buildCost *= buildCostMultiplier; consumers = consumeBuilder.toArray(Consume.class); - optionalConsumers = consumeBuilder.filter(consume -> consume.optional).toArray(Consume.class); + optionalConsumers = consumeBuilder.select(consume -> consume.optional).toArray(Consume.class); + nonOptionalConsumers = consumeBuilder.select(consume -> !consume.optional).toArray(Consume.class); hasConsumers = consumers.length > 0; itemFilter = new boolean[content.items().size]; liquidFilter = new boolean[content.liquids().size]; diff --git a/core/src/mindustry/world/blocks/defense/RegenProjector.java b/core/src/mindustry/world/blocks/defense/RegenProjector.java index 6ea243954c..624e67f855 100644 --- a/core/src/mindustry/world/blocks/defense/RegenProjector.java +++ b/core/src/mindustry/world/blocks/defense/RegenProjector.java @@ -187,13 +187,13 @@ public class RegenProjector extends Block{ @Override public void draw(){ - drawer.drawBase(this); + drawer.draw(this); } @Override public void drawLight(){ super.drawLight(); - drawer.drawLights(this); + drawer.drawLight(this); } } } diff --git a/core/src/mindustry/world/blocks/defense/turrets/BaseTurret.java b/core/src/mindustry/world/blocks/defense/turrets/BaseTurret.java index 089aea2e79..f88f94fa35 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/BaseTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/BaseTurret.java @@ -43,6 +43,7 @@ public class BaseTurret extends Block{ public void init(){ //just makes things a little more convenient if(coolant != null){ + //TODO coolant fix coolant.update = false; coolant.booster = true; coolant.optional = true; diff --git a/core/src/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/mindustry/world/blocks/defense/turrets/Turret.java index 7f758dcf69..3b17ced1aa 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/Turret.java @@ -315,7 +315,7 @@ public class Turret extends ReloadTurret{ @Override public void draw(){ - draw.drawBase(this); + draw.draw(this); } @Override diff --git a/core/src/mindustry/world/blocks/heat/HeatConductor.java b/core/src/mindustry/world/blocks/heat/HeatConductor.java index 0ec24898bd..e2f7c177dc 100644 --- a/core/src/mindustry/world/blocks/heat/HeatConductor.java +++ b/core/src/mindustry/world/blocks/heat/HeatConductor.java @@ -54,13 +54,13 @@ public class HeatConductor extends Block{ @Override public void draw(){ - drawer.drawBase(this); + drawer.draw(this); } @Override public void drawLight(){ super.drawLight(); - drawer.drawLights(this); + drawer.drawLight(this); } @Override diff --git a/core/src/mindustry/world/blocks/power/BurnerGenerator.java b/core/src/mindustry/world/blocks/power/BurnerGenerator.java deleted file mode 100644 index 2ffa4efcde..0000000000 --- a/core/src/mindustry/world/blocks/power/BurnerGenerator.java +++ /dev/null @@ -1,28 +0,0 @@ -package mindustry.world.blocks.power; - -import mindustry.type.*; -import mindustry.world.draw.*; - -//TODO deprecate this whole class? -public class BurnerGenerator extends ItemLiquidGenerator{ - - public BurnerGenerator(String name){ - super(true, false, name); - - drawer = new DrawMulti(new DrawBlock(), new DrawWarmupRegion(), new DrawTurbines()); - } - - @Override - protected float getLiquidEfficiency(Liquid liquid){ - return liquid.flammability; - } - - @Override - protected float getItemEfficiency(Item item){ - return item.flammability; - } - - public class BurnerGeneratorBuild extends ItemLiquidGeneratorBuild{ - - } -} diff --git a/core/src/mindustry/world/blocks/power/ConsumeGenerator.java b/core/src/mindustry/world/blocks/power/ConsumeGenerator.java index e2c88a0cfa..5a9e779e0c 100644 --- a/core/src/mindustry/world/blocks/power/ConsumeGenerator.java +++ b/core/src/mindustry/world/blocks/power/ConsumeGenerator.java @@ -7,6 +7,7 @@ import mindustry.content.*; import mindustry.entities.*; import mindustry.graphics.*; import mindustry.type.*; +import mindustry.world.consumers.*; import mindustry.world.meta.*; /** @@ -22,6 +23,9 @@ public class ConsumeGenerator extends PowerGenerator{ public @Nullable LiquidStack liquidOutput; + public @Nullable ConsumeItemFilter filterItem; + public @Nullable ConsumeLiquidFilter filterLiquid; + public ConsumeGenerator(String name){ super(name); } @@ -37,10 +41,15 @@ public class ConsumeGenerator extends PowerGenerator{ @Override public void init(){ + filterItem = findConsumer(c -> c instanceof ConsumeItemFilter); + filterLiquid = findConsumer(c -> c instanceof ConsumeLiquidFilter); + if(liquidOutput != null){ outputsLiquid = true; hasLiquids = true; } + + //TODO hardcoded emitLight = true; lightRadius = 65f * size; super.init(); @@ -61,6 +70,7 @@ public class ConsumeGenerator extends PowerGenerator{ public class ConsumeGeneratorBuild extends GeneratorBuild{ public float warmup, totalTime; + public float itemMultiplier = 1f; @Override public void updateTile(){ @@ -68,7 +78,17 @@ public class ConsumeGenerator extends PowerGenerator{ warmup = Mathf.lerpDelta(warmup, enabled && valid ? 1f : 0f, 0.05f); - productionEfficiency = valid ? 1f : 0f; + float multiplier = 1f; + if(valid){ + if(filterItem != null && filterItem.getConsumed(this) != null){ + itemMultiplier = filterItem.getEfficiency(this); + } + + //efficiency is added together + multiplier *= itemMultiplier + (filterLiquid == null ? 0f : filterLiquid.getEfficiency(this)); + } + + productionEfficiency = (valid ? 1f : 0f) * multiplier; totalTime += warmup * Time.delta; //randomly produce the effect @@ -93,10 +113,6 @@ public class ConsumeGenerator extends PowerGenerator{ generateTime -= Math.min(1f / itemDuration * delta(), generateTime); } - public float getEfficiencyMultiplier(){ - return 1f; - } - @Override public boolean consumeTriggerValid(){ return generateTime > 0; @@ -114,7 +130,9 @@ public class ConsumeGenerator extends PowerGenerator{ @Override public void drawLight(){ - //TODO + //??? + drawer.drawLight(this); + //TODO hard coded Drawf.light(team, x, y, (60f + Mathf.absin(10f, 5f)) * size, Color.orange, 0.5f * warmup); } } diff --git a/core/src/mindustry/world/blocks/power/DecayGenerator.java b/core/src/mindustry/world/blocks/power/DecayGenerator.java deleted file mode 100644 index 0bb9e2eac9..0000000000 --- a/core/src/mindustry/world/blocks/power/DecayGenerator.java +++ /dev/null @@ -1,19 +0,0 @@ -package mindustry.world.blocks.power; - -import mindustry.type.*; -import mindustry.world.meta.*; - -public class DecayGenerator extends ItemLiquidGenerator{ - - public DecayGenerator(String name){ - super(true, false, name); - hasItems = true; - hasLiquids = false; - envEnabled = Env.any; - } - - @Override - protected float getItemEfficiency(Item item){ - return item.radioactivity; - } -} diff --git a/core/src/mindustry/world/blocks/power/ItemLiquidGenerator.java b/core/src/mindustry/world/blocks/power/ItemLiquidGenerator.java deleted file mode 100644 index 2e3bf4f028..0000000000 --- a/core/src/mindustry/world/blocks/power/ItemLiquidGenerator.java +++ /dev/null @@ -1,173 +0,0 @@ -package mindustry.world.blocks.power; - -import arc.func.*; -import arc.graphics.*; -import arc.math.*; -import arc.util.*; -import mindustry.content.*; -import mindustry.entities.*; -import mindustry.graphics.*; -import mindustry.type.*; -import mindustry.world.consumers.*; -import mindustry.world.draw.*; -import mindustry.world.meta.*; - -import static mindustry.Vars.*; - -/** - * Power generation block which can use items, liquids or both as input sources for power production. - * Liquids will take priority over items. - */ -//TODO remove -@Deprecated -public class ItemLiquidGenerator extends PowerGenerator{ - public float minItemEfficiency = 0.2f; - /** The time in number of ticks during which a single item will produce power. */ - public float itemDuration = 70f; - - /** Minimum liquid efficiency for a generator to accept it. */ - public float minLiquidEfficiency = 0.2f; - /** Maximum liquid used per frame. */ - public float maxLiquidGenerate = 0.4f; - - public Effect generateEffect = Fx.generatespark; - public float generateEffectRnd = 3f; - public Effect explodeEffect = Fx.generatespark; - public boolean randomlyExplode = true; - public boolean defaults = false; - - public ItemLiquidGenerator(boolean hasItems, boolean hasLiquids, String name){ - this(name); - this.hasItems = hasItems; - this.hasLiquids = hasLiquids; - setDefaults(); - } - - public ItemLiquidGenerator(String name){ - super(name); - - drawer = new DrawMulti(new DrawBlock(), new DrawWarmupRegion()); - } - - protected void setDefaults(){ - if(hasItems){ - consume(new ConsumeItemFilter(item -> getItemEfficiency(item) >= minItemEfficiency)).update(false).optional(true, false); - } - - if(hasLiquids){ - consume(new ConsumeLiquidFilter(liquid -> getLiquidEfficiency(liquid) >= minLiquidEfficiency, maxLiquidGenerate)).update(false).optional(true, false); - } - - defaults = true; - } - - @Override - public void init(){ - emitLight = true; - lightRadius = 65f * size; - if(!defaults){ - setDefaults(); - } - super.init(); - } - - @Override - public void setStats(){ - super.setStats(); - - if(hasItems){ - stats.add(Stat.productionTime, itemDuration / 60f, StatUnit.seconds); - } - } - - protected float getItemEfficiency(Item item){ - return 0.0f; - } - - protected float getLiquidEfficiency(Liquid liquid){ - return 0.0f; - } - - public class ItemLiquidGeneratorBuild extends GeneratorBuild{ - protected Boolf liquidFilter = other -> liquids.get(other) >= 0.001f && getLiquidEfficiency(other) >= minLiquidEfficiency; - - public float explosiveness, heat, totalTime; - - @Override - public boolean productionValid(){ - return generateTime > 0; - } - - @Override - public void updateTile(){ - //Note: Do not use this delta when calculating the amount of power or the power efficiency, but use it for resource consumption if necessary. - //Power amount is delta'd by PowerGraph class already. - float calculationDelta = delta(); - boolean cons = consValid(); - - heat = Mathf.lerpDelta(heat, generateTime >= 0.001f && enabled && cons ? 1f : 0f, 0.05f); - - if(!cons){ - productionEfficiency = 0.0f; - return; - } - - Liquid liquid = hasLiquids ? content.liquids().find(liquidFilter) : null; - totalTime += heat * Time.delta; - - //liquid takes priority over solids - //TODO several issues with this! - it does not work correctly, consumption should not be handled here, why am I re-implementing consumes - //TODO what an awful class - if(hasLiquids && liquid != null && liquids.get(liquid) >= 0.001f){ - float baseLiquidEfficiency = getLiquidEfficiency(liquid); - float maximumPossible = maxLiquidGenerate * calculationDelta; - float used = Math.min(liquids.get(liquid) * calculationDelta, maximumPossible); - - liquids.remove(liquid, used); - productionEfficiency = baseLiquidEfficiency * used / maximumPossible; - - //TODO this aggressively spams the generate effect why would anyone want this why is this here - if(used > 0.001f && (generateTime -= delta()) <= 0f){ - generateEffect.at(x + Mathf.range(generateEffectRnd), y + Mathf.range(generateEffectRnd)); - generateTime = 1f; - } - }else if(hasItems){ - // No liquids accepted or none supplied, try using items if accepted - if(generateTime <= 0f && items.total() > 0){ - generateEffect.at(x + Mathf.range(generateEffectRnd), y + Mathf.range(generateEffectRnd)); - Item item = items.take(); - productionEfficiency = getItemEfficiency(item); - explosiveness = item.explosiveness; - generateTime = 1f; - } - - if(generateTime > 0f){ - generateTime -= Math.min(1f / itemDuration * delta(), generateTime); - - if(randomlyExplode && state.rules.reactorExplosions && Mathf.chance(delta() * 0.06 * Mathf.clamp(explosiveness - 0.5f))){ - //this block is run last so that in the event of a block destruction, no code relies on the block type - damage(Mathf.random(11f)); - explodeEffect.at(x + Mathf.range(size * tilesize / 2f), y + Mathf.range(size * tilesize / 2f)); - } - }else{ - productionEfficiency = 0.0f; - } - } - } - - @Override - public float warmup(){ - return heat; - } - - @Override - public float totalProgress(){ - return totalTime; - } - - @Override - public void drawLight(){ - Drawf.light(team, x, y, (60f + Mathf.absin(10f, 5f)) * size, Color.orange, 0.5f * heat); - } - } -} diff --git a/core/src/mindustry/world/blocks/power/PowerGenerator.java b/core/src/mindustry/world/blocks/power/PowerGenerator.java index 463ffce8f5..f2a441e4c5 100644 --- a/core/src/mindustry/world/blocks/power/PowerGenerator.java +++ b/core/src/mindustry/world/blocks/power/PowerGenerator.java @@ -73,13 +73,13 @@ public class PowerGenerator extends PowerDistributor{ @Override public void draw(){ - drawer.drawBase(this); + drawer.draw(this); } @Override public void drawLight(){ super.drawLight(); - drawer.drawLights(this); + drawer.drawLight(this); } @Override diff --git a/core/src/mindustry/world/blocks/production/GenericCrafter.java b/core/src/mindustry/world/blocks/production/GenericCrafter.java index b5b4cd0fe8..9b8bd7f5cf 100644 --- a/core/src/mindustry/world/blocks/production/GenericCrafter.java +++ b/core/src/mindustry/world/blocks/production/GenericCrafter.java @@ -31,8 +31,8 @@ public class GenericCrafter extends Block{ /** if true, crafters with multiple liquid outputs will dump excess when there's still space for at least one liquid type */ public boolean dumpExtraLiquid = true; public boolean ignoreLiquidFullness = false; - /** if true, liquid will be outputted continuously regardless of craft time */ - public boolean continuousLiquidOutput = false; + + //TODO should be seconds? public float craftTime = 80; public Effect craftEffect = Fx.none; public Effect updateEffect = Fx.none; @@ -66,7 +66,7 @@ public class GenericCrafter extends Block{ } if(outputLiquids != null){ - stats.add(Stat.output, StatValues.liquids(continuousLiquidOutput ? 1f : craftTime, outputLiquids)); + stats.add(Stat.output, StatValues.liquids(1f, outputLiquids)); } } @@ -145,13 +145,13 @@ public class GenericCrafter extends Block{ @Override public void draw(){ - drawer.drawBase(this); + drawer.draw(this); } @Override public void drawLight(){ super.drawLight(); - drawer.drawLights(this); + drawer.drawLight(this); } @Override @@ -193,7 +193,7 @@ public class GenericCrafter extends Block{ warmup = Mathf.approachDelta(warmup, warmupTarget(), warmupSpeed); //continuously output based on efficiency - if(outputLiquids != null && continuousLiquidOutput){ + if(outputLiquids != null){ float inc = getProgressIncrease(1f); for(var output : outputLiquids){ handleLiquid(this, output.liquid, Math.min(output.amount * inc, liquidCapacity - liquids.get(output.liquid))); @@ -242,12 +242,6 @@ public class GenericCrafter extends Block{ } } - if(outputLiquids != null && !continuousLiquidOutput){ - for(var output : outputLiquids){ - handleLiquid(this, output.liquid, output.amount); - } - } - craftEffect.at(x, y); progress %= 1f; } diff --git a/core/src/mindustry/world/blocks/production/LiquidConverter.java b/core/src/mindustry/world/blocks/production/LiquidConverter.java deleted file mode 100644 index 674f4b88dd..0000000000 --- a/core/src/mindustry/world/blocks/production/LiquidConverter.java +++ /dev/null @@ -1,72 +0,0 @@ -package mindustry.world.blocks.production; - -import arc.math.*; -import arc.util.*; -import mindustry.world.consumers.*; -import mindustry.world.meta.*; - -public class LiquidConverter extends GenericCrafter{ - protected @Nullable ConsumeLiquid consumer; - - public LiquidConverter(String name){ - super(name); - hasLiquids = true; - } - - @Override - public boolean outputsItems(){ - return false; - } - - @Override - public void init(){ - super.init(); - - consumer = findConsumer(b -> b instanceof ConsumeLiquid); - if(consumer == null) throw new RuntimeException("LiquidConverters must have a ConsumeLiquid."); - consumer.update = false; - } - - @Override - public void setStats(){ - super.setStats(); - stats.remove(Stat.output); - stats.add(Stat.output, outputLiquid.liquid, outputLiquid.amount * 60f, true); - } - - public class LiquidConverterBuild extends GenericCrafterBuild{ - @Override - public void drawLight(){ - if(hasLiquids && drawLiquidLight && outputLiquid.liquid.lightColor.a > 0.001f){ - drawLiquidLight(outputLiquid.liquid, liquids.get(outputLiquid.liquid)); - } - } - - @Override - public void updateTile(){ - if(consValid()){ - if(Mathf.chanceDelta(updateEffectChance)){ - updateEffect.at(x + Mathf.range(size * 4f), y + Mathf.range(size * 4)); - } - - warmup = Mathf.lerpDelta(warmup, 1f, 0.02f); - float use = Math.min(consumer.amount * edelta(), liquidCapacity - liquids.get(outputLiquid.liquid)); - float ratio = outputLiquid.amount / consumer.amount; - - liquids.remove(consumer.liquid, Math.min(use, liquids.get(consumer.liquid))); - - progress += use / consumer.amount; - liquids.add(outputLiquid.liquid, use * ratio); - if(progress >= craftTime){ - consume(); - progress %= craftTime; - } - }else{ - //warmup is still 1 even if not consuming - warmup = Mathf.lerp(warmup, canConsume() ? 1f : 0f, 0.02f); - } - - dumpLiquid(outputLiquid.liquid); - } - } -} diff --git a/core/src/mindustry/world/blocks/production/Pump.java b/core/src/mindustry/world/blocks/production/Pump.java index fd3a6224cf..36bcf77c24 100644 --- a/core/src/mindustry/world/blocks/production/Pump.java +++ b/core/src/mindustry/world/blocks/production/Pump.java @@ -110,13 +110,13 @@ public class Pump extends LiquidBlock{ @Override public void draw(){ - draw.drawBase(this); + draw.draw(this); } @Override public void drawLight(){ super.drawLight(); - draw.drawLights(this); + draw.drawLight(this); } @Override diff --git a/core/src/mindustry/world/consumers/Consume.java b/core/src/mindustry/world/consumers/Consume.java index 6614b47cd8..154ed7382f 100644 --- a/core/src/mindustry/world/consumers/Consume.java +++ b/core/src/mindustry/world/consumers/Consume.java @@ -7,11 +7,14 @@ import mindustry.world.meta.*; /** An abstract class that defines a type of resource that a block can consume. */ public abstract class Consume{ + + //TODO maybe remove these and make it an interface if possible? /** If true, this consumer will not influence consumer validity. */ public boolean optional; /** If true, this consumer will be displayed as a boost input. */ public boolean booster; //TODO bad. I don't like it. + @Deprecated public boolean update = true; /** @@ -31,6 +34,7 @@ public abstract class Consume{ return optional(true, true); } + @Deprecated public Consume update(boolean update){ this.update = update; return this; diff --git a/core/src/mindustry/world/consumers/ConsumeItemCharged.java b/core/src/mindustry/world/consumers/ConsumeItemCharged.java new file mode 100644 index 0000000000..8a27f6018f --- /dev/null +++ b/core/src/mindustry/world/consumers/ConsumeItemCharged.java @@ -0,0 +1,21 @@ +package mindustry.world.consumers; + +import mindustry.gen.*; + +/** For mods. I don't use this (yet). */ +public class ConsumeItemCharged extends ConsumeItemFilter{ + + public ConsumeItemCharged(float minCharge){ + super(item -> item.charge >= minCharge); + } + + public ConsumeItemCharged(){ + this(0.2f); + } + + @Override + public float getEfficiency(Building build){ + var item = getConsumed(build); + return item == null ? 0f : item.charge; + } +} diff --git a/core/src/mindustry/world/consumers/ConsumeItemExplode.java b/core/src/mindustry/world/consumers/ConsumeItemExplode.java new file mode 100644 index 0000000000..9daa460810 --- /dev/null +++ b/core/src/mindustry/world/consumers/ConsumeItemExplode.java @@ -0,0 +1,64 @@ +package mindustry.world.consumers; + +import arc.math.*; +import arc.scene.ui.layout.*; +import mindustry.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.gen.*; +import mindustry.world.*; +import mindustry.world.meta.*; + +import static mindustry.Vars.*; + +/** Causes a block to explode when explosive items are moved into it. */ +public class ConsumeItemExplode extends ConsumeItemFilter{ + public float damage = 4f; + public float threshold, baseChance = 0.06f; + public Effect explodeEffect = Fx.generatespark; + + public ConsumeItemExplode(float threshold){ + super(item -> item.explosiveness >= threshold); + this.threshold = threshold; + } + + public ConsumeItemExplode(){ + this(0.5f); + } + + @Override + public void update(Building build){ + var item = getConsumed(build); + + if(item != null){ + if(Vars.state.rules.reactorExplosions && Mathf.chance(build.delta() * baseChance * Mathf.clamp(item.explosiveness - threshold))){ + build.damage(damage); + explodeEffect.at(build.x + Mathf.range(build.block.size * tilesize / 2f), build.y + Mathf.range(build.block.size * tilesize / 2f)); + } + } + } + + //as this consumer doesn't actually consume anything, all methods below are empty + + @Override + public void build(Building build, Table table){} + + @Override + public void trigger(Building build){} + + @Override + public void display(Stats stats){} + + @Override + public void apply(Block block){} + + @Override + public float getEfficiency(Building build){ + return 1f; + } + + @Override + public boolean valid(Building build){ + return true; + } +} diff --git a/core/src/mindustry/world/consumers/ConsumeItemFilter.java b/core/src/mindustry/world/consumers/ConsumeItemFilter.java index d92f83ae28..c7be9afcbc 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemFilter.java +++ b/core/src/mindustry/world/consumers/ConsumeItemFilter.java @@ -46,6 +46,11 @@ public class ConsumeItemFilter extends Consume{ } } + /** @return efficiency multiplier based on current item to be consumed; overridden in subclasses. Returns 0 if not valid in subclasses. */ + public float getEfficiency(Building build){ + return 1f; + } + public @Nullable Item getConsumed(Building build){ for(int i = 0; i < content.items().size; i++){ Item item = content.item(i); diff --git a/core/src/mindustry/world/consumers/ConsumeItemFlammable.java b/core/src/mindustry/world/consumers/ConsumeItemFlammable.java new file mode 100644 index 0000000000..8e782d0eb3 --- /dev/null +++ b/core/src/mindustry/world/consumers/ConsumeItemFlammable.java @@ -0,0 +1,20 @@ +package mindustry.world.consumers; + +import mindustry.gen.*; + +public class ConsumeItemFlammable extends ConsumeItemFilter{ + + public ConsumeItemFlammable(float minFlammability){ + super(item -> item.flammability >= minFlammability); + } + + public ConsumeItemFlammable(){ + this(0.2f); + } + + @Override + public float getEfficiency(Building build){ + var item = getConsumed(build); + return item == null ? 0f : item.flammability; + } +} diff --git a/core/src/mindustry/world/consumers/ConsumeItemRadioactive.java b/core/src/mindustry/world/consumers/ConsumeItemRadioactive.java new file mode 100644 index 0000000000..2dfd7295c3 --- /dev/null +++ b/core/src/mindustry/world/consumers/ConsumeItemRadioactive.java @@ -0,0 +1,20 @@ +package mindustry.world.consumers; + +import mindustry.gen.*; + +public class ConsumeItemRadioactive extends ConsumeItemFilter{ + + public ConsumeItemRadioactive(float minRadioactivity){ + super(item -> item.radioactivity >= minRadioactivity); + } + + public ConsumeItemRadioactive(){ + this(0.2f); + } + + @Override + public float getEfficiency(Building build){ + var item = getConsumed(build); + return item == null ? 0f : item.radioactivity; + } +} diff --git a/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java b/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java index 1cae6e00bf..63b105d5b5 100644 --- a/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java +++ b/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java @@ -51,6 +51,11 @@ public class ConsumeLiquidFilter extends ConsumeLiquidBase{ var liq = getConsumed(build); return liq != null && build.liquids.get(liq) >= use(build); } + + /** @return efficiency multiplier based on current item to be consumed; overridden in subclasses. Returns 0 if not valid in subclasses. */ + public float getEfficiency(Building build){ + return 1f; + } public @Nullable Liquid getConsumed(Building build){ float u = use(build); diff --git a/core/src/mindustry/world/consumers/ConsumeLiquidFlammable.java b/core/src/mindustry/world/consumers/ConsumeLiquidFlammable.java new file mode 100644 index 0000000000..ec3a1e5040 --- /dev/null +++ b/core/src/mindustry/world/consumers/ConsumeLiquidFlammable.java @@ -0,0 +1,20 @@ +package mindustry.world.consumers; + +import mindustry.gen.*; + +public class ConsumeLiquidFlammable extends ConsumeLiquidFilter{ + + public ConsumeLiquidFlammable(float minFlammability, float amount){ + super(item -> item.flammability >= minFlammability, amount); + } + + public ConsumeLiquidFlammable(float amount){ + this(0.2f, amount); + } + + @Override + public float getEfficiency(Building build){ + var item = getConsumed(build); + return item == null ? 0f : item.flammability; + } +} diff --git a/core/src/mindustry/world/draw/DrawAnimation.java b/core/src/mindustry/world/draw/DrawAnimation.java index fdf37bfb87..d4fb67b0c7 100644 --- a/core/src/mindustry/world/draw/DrawAnimation.java +++ b/core/src/mindustry/world/draw/DrawAnimation.java @@ -15,7 +15,7 @@ public class DrawAnimation extends DrawBlock{ public TextureRegion liquid, top; @Override - public void drawBase(Building build){ + public void draw(Building build){ Draw.rect(build.block.region, build.x, build.y); Draw.rect( sine ? diff --git a/core/src/mindustry/world/draw/DrawArcSmelter.java b/core/src/mindustry/world/draw/DrawArcSmelter.java index 8bec2c68ea..4d5fddf1ed 100644 --- a/core/src/mindustry/world/draw/DrawArcSmelter.java +++ b/core/src/mindustry/world/draw/DrawArcSmelter.java @@ -22,7 +22,7 @@ public class DrawArcSmelter extends DrawBlock{ public Blending blending = Blending.additive; @Override - public void drawBase(Building build){ + public void draw(Building build){ if(drawBottom) Draw.rect(bottom, build.x, build.y); if(build.warmup() > 0f && flameColor.a > 0.001f){ diff --git a/core/src/mindustry/world/draw/DrawBlock.java b/core/src/mindustry/world/draw/DrawBlock.java index 4bd8a4fe79..1c8d9555fc 100644 --- a/core/src/mindustry/world/draw/DrawBlock.java +++ b/core/src/mindustry/world/draw/DrawBlock.java @@ -23,12 +23,12 @@ public class DrawBlock{ } /** Draws the block itself. */ - public void drawBase(Building build){ + public void draw(Building build){ Draw.rect(build.block.region, build.x, build.y, build.drawrot()); } /** Draws any extra light for the block. */ - public void drawLights(Building build){ + public void drawLight(Building build){ } diff --git a/core/src/mindustry/world/draw/DrawBlurSpin.java b/core/src/mindustry/world/draw/DrawBlurSpin.java index 760b2dead1..8e723fa1fe 100644 --- a/core/src/mindustry/world/draw/DrawBlurSpin.java +++ b/core/src/mindustry/world/draw/DrawBlurSpin.java @@ -23,7 +23,7 @@ public class DrawBlurSpin extends DrawBlock{ } @Override - public void drawBase(Building build){ + public void draw(Building build){ Drawf.spinSprite(build.warmup() > blurThresh ? blurRegion : region, build.x + x, build.y + y, build.totalProgress() * rotateSpeed); } diff --git a/core/src/mindustry/world/draw/DrawBubbles.java b/core/src/mindustry/world/draw/DrawBubbles.java index b8d955937b..3216ee2d76 100644 --- a/core/src/mindustry/world/draw/DrawBubbles.java +++ b/core/src/mindustry/world/draw/DrawBubbles.java @@ -21,7 +21,7 @@ public class DrawBubbles extends DrawPartial{ } @Override - public void drawBase(Building build){ + public void draw(Building build){ if(build.warmup() <= 0.001f) return; Draw.color(color); diff --git a/core/src/mindustry/world/draw/DrawCells.java b/core/src/mindustry/world/draw/DrawCells.java index 1e62cc8d56..e3f182711f 100644 --- a/core/src/mindustry/world/draw/DrawCells.java +++ b/core/src/mindustry/world/draw/DrawCells.java @@ -16,7 +16,7 @@ public class DrawCells extends DrawBlock{ public float range = 4f, recurrence = 6f, radius = 3f, lifetime = 60f; @Override - public void drawBase(Building build){ + public void draw(Building build){ Draw.rect(bottom, build.x, build.y); diff --git a/core/src/mindustry/world/draw/DrawCircles.java b/core/src/mindustry/world/draw/DrawCircles.java index d2132a55d7..ea376913e8 100644 --- a/core/src/mindustry/world/draw/DrawCircles.java +++ b/core/src/mindustry/world/draw/DrawCircles.java @@ -22,7 +22,7 @@ public class DrawCircles extends DrawPartial{ } @Override - public void drawBase(Building build){ + public void draw(Building build){ if(build.warmup() <= 0.001f) return; Draw.color(color, build.warmup() * color.a); diff --git a/core/src/mindustry/world/draw/DrawCrucibleFlame.java b/core/src/mindustry/world/draw/DrawCrucibleFlame.java index 5b56341706..9b5ccb287a 100644 --- a/core/src/mindustry/world/draw/DrawCrucibleFlame.java +++ b/core/src/mindustry/world/draw/DrawCrucibleFlame.java @@ -17,7 +17,7 @@ public class DrawCrucibleFlame extends DrawPartial{ public Interp particleInterp = new PowIn(1.5f); @Override - public void drawBase(Building build){ + public void draw(Building build){ if(build.warmup() > 0f && flameColor.a > 0.001f){ Lines.stroke(circleStroke * build.warmup()); diff --git a/core/src/mindustry/world/draw/DrawCultivator.java b/core/src/mindustry/world/draw/DrawCultivator.java index d883f650a4..b357120929 100644 --- a/core/src/mindustry/world/draw/DrawCultivator.java +++ b/core/src/mindustry/world/draw/DrawCultivator.java @@ -21,7 +21,7 @@ public class DrawCultivator extends DrawBlock{ public TextureRegion top; @Override - public void drawBase(Building build){ + public void draw(Building build){ Draw.rect(build.block.region, build.x, build.y); Drawf.liquid(middle, build.x, build.y, build.warmup(), plantColor); diff --git a/core/src/mindustry/world/draw/DrawGlow.java b/core/src/mindustry/world/draw/DrawGlow.java index 067835f496..1b91a4f6c7 100644 --- a/core/src/mindustry/world/draw/DrawGlow.java +++ b/core/src/mindustry/world/draw/DrawGlow.java @@ -12,7 +12,7 @@ public class DrawGlow extends DrawBlock{ public TextureRegion top; @Override - public void drawBase(Building build){ + public void draw(Building build){ Draw.rect(build.block.region, build.x, build.y); Draw.alpha(Mathf.absin(build.totalProgress(), glowScale, glowAmount) * build.warmup()); Draw.rect(top, build.x, build.y); diff --git a/core/src/mindustry/world/draw/DrawGlowRegion.java b/core/src/mindustry/world/draw/DrawGlowRegion.java index 800bdbcdfd..0789b22b8d 100644 --- a/core/src/mindustry/world/draw/DrawGlowRegion.java +++ b/core/src/mindustry/world/draw/DrawGlowRegion.java @@ -36,7 +36,7 @@ public class DrawGlowRegion extends DrawPartial{ } @Override - public void drawBase(Building build){ + public void draw(Building build){ if(build.warmup() <= 0.001f) return; float z = Draw.z(); diff --git a/core/src/mindustry/world/draw/DrawHeatInput.java b/core/src/mindustry/world/draw/DrawHeatInput.java index bb5005ac71..4e3ba3624f 100644 --- a/core/src/mindustry/world/draw/DrawHeatInput.java +++ b/core/src/mindustry/world/draw/DrawHeatInput.java @@ -31,7 +31,7 @@ public class DrawHeatInput extends DrawBlock{ } @Override - public void drawBase(Building build){ + public void draw(Building build){ Draw.z(Layer.blockAdditive); if(build instanceof HeatConsumer hc){ diff --git a/core/src/mindustry/world/draw/DrawHeatOutput.java b/core/src/mindustry/world/draw/DrawHeatOutput.java index e88459b417..d5fd9d6946 100644 --- a/core/src/mindustry/world/draw/DrawHeatOutput.java +++ b/core/src/mindustry/world/draw/DrawHeatOutput.java @@ -26,7 +26,7 @@ public class DrawHeatOutput extends DrawBlock{ } @Override - public void drawBase(Building build){ + public void draw(Building build){ if(drawRegion) Draw.rect(build.block.region, build.x, build.y); Draw.rect(build.rotation > 1 ? top2 : top1, build.x, build.y, build.rotdeg()); diff --git a/core/src/mindustry/world/draw/DrawHeatRegion.java b/core/src/mindustry/world/draw/DrawHeatRegion.java index 45b6c4ce1a..34d91500db 100644 --- a/core/src/mindustry/world/draw/DrawHeatRegion.java +++ b/core/src/mindustry/world/draw/DrawHeatRegion.java @@ -25,7 +25,7 @@ public class DrawHeatRegion extends DrawBlock{ } @Override - public void drawBase(Building build){ + public void draw(Building build){ Draw.z(Layer.blockAdditive); if(build instanceof HeatCrafterBuild hc && hc.heat > 0){ diff --git a/core/src/mindustry/world/draw/DrawLiquid.java b/core/src/mindustry/world/draw/DrawLiquid.java index 1620557962..b27dc93a26 100644 --- a/core/src/mindustry/world/draw/DrawLiquid.java +++ b/core/src/mindustry/world/draw/DrawLiquid.java @@ -22,7 +22,7 @@ public class DrawLiquid extends DrawBlock{ } @Override - public void drawBase(Building build){ + public void draw(Building build){ Draw.rect(build.block.region, build.x, build.y); GenericCrafter type = (GenericCrafter)build.block; diff --git a/core/src/mindustry/world/draw/DrawLiquidOutputs.java b/core/src/mindustry/world/draw/DrawLiquidOutputs.java index 6d64996449..280cb22f3f 100644 --- a/core/src/mindustry/world/draw/DrawLiquidOutputs.java +++ b/core/src/mindustry/world/draw/DrawLiquidOutputs.java @@ -13,7 +13,7 @@ public class DrawLiquidOutputs extends DrawBlock{ public TextureRegion[][] liquidOutputRegions; @Override - public void drawBase(Building build){ + public void draw(Building build){ GenericCrafter crafter = (GenericCrafter)build.block; if(crafter.outputLiquids == null) return; diff --git a/core/src/mindustry/world/draw/DrawLiquidRegion.java b/core/src/mindustry/world/draw/DrawLiquidRegion.java index c6d744abbf..94c7e4a1ee 100644 --- a/core/src/mindustry/world/draw/DrawLiquidRegion.java +++ b/core/src/mindustry/world/draw/DrawLiquidRegion.java @@ -23,7 +23,7 @@ public class DrawLiquidRegion extends DrawPartial{ } @Override - public void drawBase(Building build){ + public void draw(Building build){ if(!build.block.hasLiquids) return; Liquid drawn = drawLiquid != null ? drawLiquid : build.liquids.current(); diff --git a/core/src/mindustry/world/draw/DrawLiquidTile.java b/core/src/mindustry/world/draw/DrawLiquidTile.java index be00a8622d..e96acd8b18 100644 --- a/core/src/mindustry/world/draw/DrawLiquidTile.java +++ b/core/src/mindustry/world/draw/DrawLiquidTile.java @@ -23,7 +23,7 @@ public class DrawLiquidTile extends DrawPartial{ } @Override - public void drawBase(Building build){ + public void draw(Building build){ Liquid drawn = drawLiquid != null ? drawLiquid : build.liquids.current(); LiquidBlock.drawTiledFrames(build.block.size, build.x, build.y, padding, drawn, build.liquids.get(drawn) / build.block.liquidCapacity * alpha); } diff --git a/core/src/mindustry/world/draw/DrawMixer.java b/core/src/mindustry/world/draw/DrawMixer.java index a848dc1cea..e1d1b38c59 100644 --- a/core/src/mindustry/world/draw/DrawMixer.java +++ b/core/src/mindustry/world/draw/DrawMixer.java @@ -22,7 +22,7 @@ public class DrawMixer extends DrawBlock{ } @Override - public void drawBase(Building build){ + public void draw(Building build){ GenericCrafter crafter = (GenericCrafter)build.block; float rotation = build.block.rotate ? build.rotdeg() : 0; Draw.rect(bottom, build.x, build.y, rotation); diff --git a/core/src/mindustry/world/draw/DrawMulti.java b/core/src/mindustry/world/draw/DrawMulti.java index 51867d5eeb..04c94ec39b 100644 --- a/core/src/mindustry/world/draw/DrawMulti.java +++ b/core/src/mindustry/world/draw/DrawMulti.java @@ -32,9 +32,9 @@ public class DrawMulti extends DrawBlock{ } @Override - public void drawBase(Building build){ + public void draw(Building build){ for(var draw : drawers){ - draw.drawBase(build); + draw.draw(build); } } @@ -46,9 +46,9 @@ public class DrawMulti extends DrawBlock{ } @Override - public void drawLights(Building build){ + public void drawLight(Building build){ for(var draw : drawers){ - draw.drawLights(build); + draw.drawLight(build); } } diff --git a/core/src/mindustry/world/draw/DrawMultiWeave.java b/core/src/mindustry/world/draw/DrawMultiWeave.java index 8982a896c4..d11e0b5fe6 100644 --- a/core/src/mindustry/world/draw/DrawMultiWeave.java +++ b/core/src/mindustry/world/draw/DrawMultiWeave.java @@ -15,7 +15,7 @@ public class DrawMultiWeave extends DrawBlock{ public float pulse = 0.3f, pulseScl = 10f; @Override - public void drawBase(Building build){ + public void draw(Building build){ Draw.rect(weave, build.x, build.y, build.totalProgress() * rotateSpeed); Draw.rect(weave, build.x, build.y, build.totalProgress() * rotateSpeed * rotateSpeed2); diff --git a/core/src/mindustry/world/draw/DrawParticles.java b/core/src/mindustry/world/draw/DrawParticles.java index 16d1c70a52..171a904b6e 100644 --- a/core/src/mindustry/world/draw/DrawParticles.java +++ b/core/src/mindustry/world/draw/DrawParticles.java @@ -20,7 +20,7 @@ public class DrawParticles extends DrawBlock{ public Blending blending = Blending.normal; @Override - public void drawBase(Building build){ + public void draw(Building build){ if(build.warmup() > 0f){ diff --git a/core/src/mindustry/world/draw/DrawPistons.java b/core/src/mindustry/world/draw/DrawPistons.java index d4e550e43a..c14d6fe72a 100644 --- a/core/src/mindustry/world/draw/DrawPistons.java +++ b/core/src/mindustry/world/draw/DrawPistons.java @@ -19,7 +19,7 @@ public class DrawPistons extends DrawBlock{ } @Override - public void drawBase(Building build){ + public void draw(Building build){ for(int i = 0; i < sides; i++){ float len = Mathf.absin(build.totalProgress() + sinOffset + sideOffset * sinScl * i, sinScl, sinMag) + lenOffset; float angle = i * 360f / sides; diff --git a/core/src/mindustry/world/draw/DrawPulseShape.java b/core/src/mindustry/world/draw/DrawPulseShape.java index 2535e7ef31..e9e1b637dc 100644 --- a/core/src/mindustry/world/draw/DrawPulseShape.java +++ b/core/src/mindustry/world/draw/DrawPulseShape.java @@ -25,7 +25,7 @@ public class DrawPulseShape extends DrawPartial{ } @Override - public void drawBase(Building build){ + public void draw(Building build){ float pz = Draw.z(); if(layer > 0) Draw.z(layer); diff --git a/core/src/mindustry/world/draw/DrawPump.java b/core/src/mindustry/world/draw/DrawPump.java index 9879d25a09..a771df35a2 100644 --- a/core/src/mindustry/world/draw/DrawPump.java +++ b/core/src/mindustry/world/draw/DrawPump.java @@ -11,7 +11,7 @@ public class DrawPump extends DrawBlock{ public TextureRegion liquid; @Override - public void drawBase(Building build){ + public void draw(Building build){ Draw.rect(build.block.region, build.x, build.y); if(!(build instanceof PumpBuild pump) || pump.liquidDrop == null) return; diff --git a/core/src/mindustry/world/draw/DrawRegion.java b/core/src/mindustry/world/draw/DrawRegion.java index d7b4b0aabb..bd52e87aea 100644 --- a/core/src/mindustry/world/draw/DrawRegion.java +++ b/core/src/mindustry/world/draw/DrawRegion.java @@ -26,7 +26,7 @@ public class DrawRegion extends DrawBlock{ } @Override - public void drawBase(Building build){ + public void draw(Building build){ float z = Draw.z(); if(layer > 0) Draw.z(layer); if(spinSprite){ diff --git a/core/src/mindustry/world/draw/DrawRotator.java b/core/src/mindustry/world/draw/DrawRotator.java index 6c2b55a66b..54aed56bd4 100644 --- a/core/src/mindustry/world/draw/DrawRotator.java +++ b/core/src/mindustry/world/draw/DrawRotator.java @@ -20,7 +20,7 @@ public class DrawRotator extends DrawBlock{ } @Override - public void drawBase(Building build){ + public void draw(Building build){ Draw.rect(build.block.region, build.x, build.y); if(drawSpinSprite){ Drawf.spinSprite(rotator, build.x, build.y, build.totalProgress() * spinSpeed); diff --git a/core/src/mindustry/world/draw/DrawShape.java b/core/src/mindustry/world/draw/DrawShape.java index f7a5299116..a5257f69cf 100644 --- a/core/src/mindustry/world/draw/DrawShape.java +++ b/core/src/mindustry/world/draw/DrawShape.java @@ -12,7 +12,7 @@ public class DrawShape extends DrawPartial{ public boolean useWarmupRadius = false; @Override - public void drawBase(Building build){ + public void draw(Building build){ float pz = Draw.z(); if(layer > 0) Draw.z(layer); diff --git a/core/src/mindustry/world/draw/DrawSideRegion.java b/core/src/mindustry/world/draw/DrawSideRegion.java index c3ba1fc2f9..3815c203dc 100644 --- a/core/src/mindustry/world/draw/DrawSideRegion.java +++ b/core/src/mindustry/world/draw/DrawSideRegion.java @@ -19,7 +19,7 @@ public class DrawSideRegion extends DrawBlock{ } @Override - public void drawBase(Building build){ + public void draw(Building build){ if(drawRegion) Draw.rect(build.block.region, build.x, build.y); Draw.rect(build.rotation > 1 ? top2 : top1, build.x, build.y, build.rotdeg()); diff --git a/core/src/mindustry/world/draw/DrawSmelter.java b/core/src/mindustry/world/draw/DrawSmelter.java index cee63defb0..e71d966c9f 100644 --- a/core/src/mindustry/world/draw/DrawSmelter.java +++ b/core/src/mindustry/world/draw/DrawSmelter.java @@ -29,7 +29,7 @@ public class DrawSmelter extends DrawBlock{ } @Override - public void drawBase(Building build){ + public void draw(Building build){ Draw.rect(build.block.region, build.x, build.y, build.block.rotate ? build.rotdeg() : 0); if(build.warmup() > 0f && flameColor.a > 0.001f){ @@ -54,7 +54,7 @@ public class DrawSmelter extends DrawBlock{ } @Override - public void drawLights(Building build){ + public void drawLight(Building build){ Drawf.light(build.team, build.x, build.y, (lightRadius + Mathf.absin(lightSinScl, lightSinMag)) * build.warmup() * build.block.size, flameColor, lightAlpha); } } diff --git a/core/src/mindustry/world/draw/DrawSpikes.java b/core/src/mindustry/world/draw/DrawSpikes.java index 4f2acc8afb..d20b7c5813 100644 --- a/core/src/mindustry/world/draw/DrawSpikes.java +++ b/core/src/mindustry/world/draw/DrawSpikes.java @@ -19,7 +19,7 @@ public class DrawSpikes extends DrawPartial{ } @Override - public void drawBase(Building build){ + public void draw(Building build){ if(build.warmup() <= 0.001f) return; Draw.color(color, build.warmup() * color.a); diff --git a/core/src/mindustry/world/draw/DrawTurbines.java b/core/src/mindustry/world/draw/DrawTurbines.java index 2298fd585e..1224bc9a06 100644 --- a/core/src/mindustry/world/draw/DrawTurbines.java +++ b/core/src/mindustry/world/draw/DrawTurbines.java @@ -18,9 +18,7 @@ public class DrawTurbines extends DrawBlock{ } @Override - public void drawBase(Building build){ - if(!turbines[0].found()) return; - + public void draw(Building build){ float totalTime = build.totalProgress(); Draw.rect(turbines[0], build.x, build.y, totalTime * turbineSpeed); Draw.rect(turbines[1], build.x, build.y, -totalTime * turbineSpeed); diff --git a/core/src/mindustry/world/draw/DrawTurret.java b/core/src/mindustry/world/draw/DrawTurret.java index 42babad0d5..caba6b4339 100644 --- a/core/src/mindustry/world/draw/DrawTurret.java +++ b/core/src/mindustry/world/draw/DrawTurret.java @@ -44,7 +44,7 @@ public class DrawTurret extends DrawBlock{ } @Override - public void drawBase(Building build){ + public void draw(Building build){ Turret turret = (Turret)build.block; TurretBuild tb = (TurretBuild)build; diff --git a/core/src/mindustry/world/draw/DrawWarmupRegion.java b/core/src/mindustry/world/draw/DrawWarmupRegion.java index 540131a546..1145d49f04 100644 --- a/core/src/mindustry/world/draw/DrawWarmupRegion.java +++ b/core/src/mindustry/world/draw/DrawWarmupRegion.java @@ -20,7 +20,7 @@ public class DrawWarmupRegion extends DrawBlock{ } @Override - public void drawBase(Building build){ + public void draw(Building build){ Draw.color(color); Draw.alpha(build.warmup() * (1f - sinMag) + Mathf.absin(Time.time, sinScl, sinMag) * build.warmup()); Draw.rect(region, build.x, build.y); diff --git a/core/src/mindustry/world/draw/DrawWeave.java b/core/src/mindustry/world/draw/DrawWeave.java index 3c2f73798f..a4a127c893 100644 --- a/core/src/mindustry/world/draw/DrawWeave.java +++ b/core/src/mindustry/world/draw/DrawWeave.java @@ -12,7 +12,7 @@ public class DrawWeave extends DrawBlock{ public TextureRegion weave, bottom; @Override - public void drawBase(Building build){ + public void draw(Building build){ Draw.rect(bottom, build.x, build.y); Draw.rect(weave, build.x, build.y, build.totalProgress()); diff --git a/tests/src/test/java/power/ItemLiquidGeneratorTests.java b/tests/src/test/java/power/ConsumeGeneratorTests.java similarity index 61% rename from tests/src/test/java/power/ItemLiquidGeneratorTests.java rename to tests/src/test/java/power/ConsumeGeneratorTests.java index b8bcca8e67..dfbc6375b4 100644 --- a/tests/src/test/java/power/ItemLiquidGeneratorTests.java +++ b/tests/src/test/java/power/ConsumeGeneratorTests.java @@ -8,52 +8,47 @@ import mindustry.game.*; import mindustry.type.*; import mindustry.world.*; import mindustry.world.blocks.power.*; -import mindustry.world.blocks.power.ItemLiquidGenerator.*; +import mindustry.world.blocks.power.ConsumeGenerator.*; +import mindustry.world.consumers.*; import org.junit.jupiter.api.*; import java.util.*; import static org.junit.jupiter.api.Assertions.*; -import static org.junit.jupiter.api.DynamicTest.dynamicTest; +import static org.junit.jupiter.api.DynamicTest.*; /** * This class tests generators which can process items, liquids or both. * All tests are run with a fixed delta of 0.5 so delta considerations can be tested as well. - * Additionally, each PowerGraph::update() call will have its own thread frame, i.e. the method will never be called twice within the same frame. - * Both of these constraints are handled by FakeThreadHandler within PowerTestFixture. - * Any expected power amount (produced, consumed, buffered) should be affected by FakeThreadHandler.fakeDelta but status should not! + * Any expected power amount (produced, consumed, buffered) should be affected by fakeDelta but status should not! */ -public class ItemLiquidGeneratorTests extends PowerTestFixture{ - private ItemLiquidGenerator generator; +public class ConsumeGeneratorTests extends PowerTestFixture{ + private ConsumeGenerator generator; private Tile tile; - private ItemLiquidGeneratorBuild entity; + private ConsumeGeneratorBuild build; private final float fakeItemDuration = 60f; //ticks private final float maximumLiquidUsage = 0.5f; public void createGenerator(InputType inputType){ Vars.state = new GameState(); Vars.state.rules = new Rules(); - generator = new ItemLiquidGenerator(inputType != InputType.liquids, inputType != InputType.items, "fakegen" + System.nanoTime()){ - { - powerProduction = 0.1f; - itemDuration = fakeItemDuration; - maxLiquidGenerate = maximumLiquidUsage; - buildType = ItemLiquidGeneratorBuild::new; + generator = new ConsumeGenerator("fakegen" + System.nanoTime()){{ + powerProduction = 0.1f; + itemDuration = fakeItemDuration; + buildType = ConsumeGeneratorBuild::new; + + if(inputType != InputType.liquids){ + consume(new ConsumeItemFlammable()); } - @Override - public float getItemEfficiency(Item item){ - return item.flammability; + if(inputType != InputType.items){ + consume(new ConsumeLiquidFlammable(maximumLiquidUsage)); } + }}; - @Override - public float getLiquidEfficiency(Liquid liquid){ - return liquid.flammability; - } - }; - + generator.init(); tile = createFakeTile(0, 0, generator); - entity = (ItemLiquidGeneratorBuild)tile.build; + build = (ConsumeGeneratorBuild)tile.build; } /** Tests the consumption and efficiency when being supplied with liquids. */ @@ -86,16 +81,16 @@ public class ItemLiquidGeneratorTests extends PowerTestFixture{ final float expectedRemainingLiquidAmount = Math.max(0.0f, availableLiquidAmount - expectedConsumptionPerTick * Time.delta); createGenerator(inputType); - assertTrue(entity.acceptLiquid(null, liquid), inputType + " | " + parameterDescription + ": Liquids which will be declined by the generator don't need to be tested - The code won't be called for those cases."); + assertTrue(build.acceptLiquid(null, liquid), inputType + " | " + parameterDescription + ": Liquids which will be declined by the generator don't need to be tested - The code won't be called for those cases."); - entity.liquids.add(liquid, availableLiquidAmount); - entity.updateConsumption(); + build.liquids.add(liquid, availableLiquidAmount); + build.updateConsumption(); // Perform an update on the generator once - This should use up any resource up to the maximum liquid usage - entity.updateTile(); + build.updateTile(); - assertEquals(expectedRemainingLiquidAmount, entity.liquids.get(liquid), inputType + " | " + parameterDescription + ": Remaining liquid amount mismatch."); - assertEquals(expectedEfficiency, entity.productionEfficiency, inputType + " | " + parameterDescription + ": Efficiency mismatch."); + assertEquals(expectedRemainingLiquidAmount, build.liquids.get(liquid), inputType + " | " + parameterDescription + ": Remaining liquid amount mismatch."); + assertEquals(expectedEfficiency, build.productionEfficiency, inputType + " | " + parameterDescription + ": Efficiency mismatch."); } /** Tests the consumption and efficiency when being supplied with items. */ @@ -114,7 +109,6 @@ public class ItemLiquidGeneratorTests extends PowerTestFixture{ tests.add(dynamicTest("02", () -> simulateItemConsumption(inputType, Items.coal, 1, "Sufficient coal provided"))); tests.add(dynamicTest("03", () -> simulateItemConsumption(inputType, Items.coal, 10, "Excess coal provided"))); tests.add(dynamicTest("04", () -> simulateItemConsumption(inputType, Items.blastCompound, 1, "Blast compound provided"))); - //dynamicTest("03", () -> simulateItemConsumption(inputType, Items.plastanium, 1, "Plastanium provided")), // Not accepted by generator due to low flammability tests.add(dynamicTest("05", () -> simulateItemConsumption(inputType, Items.sporePod, 1, "Biomatter provided"))); tests.add(dynamicTest("06", () -> simulateItemConsumption(inputType, Items.pyratite, 1, "Pyratite provided"))); } @@ -124,27 +118,22 @@ public class ItemLiquidGeneratorTests extends PowerTestFixture{ } void simulateItemConsumption(InputType inputType, Item item, int amount, String parameterDescription){ - final float expectedEfficiency = amount > 0 ? item.flammability : 0f; - final float expectedRemainingItemAmount = Math.max(0, amount - 1); + float expectedEfficiency = amount > 0 ? item.flammability : 0f; + int expectedRemainingItemAmount = Math.max(0, amount - 1); createGenerator(inputType); - assertTrue(entity.acceptItem(null, item), inputType + " | " + parameterDescription + ": Items which will be declined by the generator don't need to be tested - The code won't be called for those cases."); + assertTrue(build.acceptItem(null, item), inputType + " | " + parameterDescription + ": Items which will be declined by the generator don't need to be tested - The code won't be called for those cases."); if(amount > 0){ - entity.items.add(item, amount); + build.items.add(item, amount); } - entity.updateConsumption(); // Perform an update on the generator once - This should use up one or zero items - dependent on if the item is accepted and available or not. - try{ - entity.updateTile(); + build.update(); + + assertEquals(expectedRemainingItemAmount, build.items.get(item), inputType + " | " + parameterDescription + ": Remaining item amount mismatch."); + assertEquals(expectedEfficiency, build.productionEfficiency, inputType + " | " + parameterDescription + ": Efficiency mismatch."); - assertEquals(expectedRemainingItemAmount, entity.items.get(item), inputType + " | " + parameterDescription + ": Remaining item amount mismatch."); - assertEquals(expectedEfficiency, entity.productionEfficiency, inputType + " | " + parameterDescription + ": Efficiency mismatch."); - }catch(NullPointerException e){ - e.printStackTrace(); - //hacky, but sometimes tests fail here and I'm not going to bother testing it - } } /** Makes sure the efficiency stays equal during the item duration. */ @@ -163,19 +152,18 @@ public class ItemLiquidGeneratorTests extends PowerTestFixture{ createGenerator(inputType); // Burn a single coal and test for the duration - entity.items.add(Items.coal, 1); - entity.updateConsumption(); - entity.updateTile(); + build.items.add(Items.coal, 1); + build.update(); - float expectedEfficiency = entity.productionEfficiency; + float expectedEfficiency = build.productionEfficiency; float currentDuration = 0.0f; while((currentDuration += Time.delta) <= fakeItemDuration){ - entity.updateTile(); - assertEquals(expectedEfficiency, entity.productionEfficiency, "Duration: " + currentDuration); + build.update(); + assertEquals(expectedEfficiency, build.productionEfficiency, "Duration: " + currentDuration); } - entity.updateTile(); - assertEquals(0.0f, entity.productionEfficiency, "Duration: " + currentDuration); + build.update(); + assertEquals(0.0f, build.productionEfficiency, "Duration: " + currentDuration); } enum InputType{ diff --git a/tools/src/mindustry/tools/Generators.java b/tools/src/mindustry/tools/Generators.java index 61078c2aaf..323fd40edc 100644 --- a/tools/src/mindustry/tools/Generators.java +++ b/tools/src/mindustry/tools/Generators.java @@ -642,6 +642,12 @@ public class Generators{ Pixmap wepReg = weapon.top ? outline.get(reg) : reg; drawWeapon.get(weapon, wepReg); + + if(weapon.cellRegion.found()){ + Pixmap weaponCell = get(weapon.cellRegion); + weaponCell.replace(in -> in == 0xffffffff ? 0xffa664ff : in == 0xdcc6c6ff || in == 0xdcc5c5ff ? 0xd06b53ff : 0); + drawWeapon.get(weapon, weaponCell); + } } //TODO I can save a LOT of space by not creating a full icon.