Generator explosion system cleanup

This commit is contained in:
Anuken 2022-08-02 13:13:37 -04:00
parent fa1a5971cf
commit e28d7b8d8d
10 changed files with 103 additions and 82 deletions

View File

@ -39,8 +39,8 @@ public class BaseRegistry{
//load ore types and corresponding items
for(Block block : content.blocks()){
if(block instanceof OreBlock && block.asFloor().itemDrop != null){
ores.put(block.asFloor().itemDrop, (OreBlock)block);
if(block instanceof OreBlock ore && ore.itemDrop != null && !ore.wallOre && !ores.containsKey(ore.itemDrop)){
ores.put(ore.itemDrop, ore);
}else if(block.isFloor() && block.asFloor().itemDrop != null && !oreFloors.containsKey(block.asFloor().itemDrop)){
oreFloors.put(block.asFloor().itemDrop, block.asFloor());
}

View File

@ -127,7 +127,7 @@ public class Blocks{
cliffCrusher, plasmaBore, largePlasmaBore, impactDrill, eruptionDrill,
//storage
coreShard, coreFoundation, /*TODO core foundation is a bad name, rename to fragment */ coreNucleus, vault, container, unloader,
coreShard, coreFoundation, coreNucleus, vault, container, unloader,
//storage - erekir
coreBastion, coreCitadel, coreAcropolis, reinforcedContainer, reinforcedVault,
@ -162,7 +162,6 @@ public class Blocks{
worldProcessor, worldCell,
//campaign
//TODO launch pad on erekir, 5x5, uses nuclear(?) fuel
launchPad, interplanetaryAccelerator
;
@ -1161,7 +1160,6 @@ public class Blocks{
consumePower(6f);
}};
//TODO better name
electrolyzer = new GenericCrafter("electrolyzer"){{
requirements(Category.crafting, with(Items.silicon, 50, Items.graphite, 40, Items.beryllium, 130, Items.tungsten, 80));
size = 3;
@ -1222,7 +1220,6 @@ public class Blocks{
heatRequirement = 6f;
//TODO continuous output
outputLiquid = new LiquidStack(Liquids.nitrogen, 4f / 60f);
}};
@ -1380,10 +1377,9 @@ public class Blocks{
}});
consumeItem(Items.silicon, 3);
//TODO must consume from 2 pumps, 1, or 1.5?
//TODO consume hydrogen/ozone?
consumeLiquid(Liquids.slag, 40f / 60f);
consumePower(2f); //TODO necessary?
consumePower(2f);
}};
cyanogenSynthesizer = new HeatCrafter("cyanogen-synthesizer"){{
@ -1415,7 +1411,6 @@ public class Blocks{
consumePower(2f);
}};
//TODO bad name, and there's no use for phase yet...
phaseSynthesizer = new HeatCrafter("phase-synthesizer"){{
requirements(Category.crafting, with(Items.carbide, 90, Items.silicon, 100, Items.thorium, 100, Items.tungsten, 200));
@ -1512,7 +1507,6 @@ public class Blocks{
envDisabled |= Env.scorching;
}};
//TODO all these should be hidden from view completely
thoriumWall = new Wall("thorium-wall"){{
requirements(Category.defense, with(Items.thorium, 6));
health = 200 * wallHealthMultiplier;
@ -2492,7 +2486,6 @@ public class Blocks{
color = Pal.slagOrange;
}});
//TODO ratios, extra requirements?
consumeLiquids(LiquidStack.with(Liquids.slag, 20f / 60f, Liquids.arkycite, 30f / 60f));
size = 3;
@ -2509,7 +2502,7 @@ public class Blocks{
//TODO still very much WIP, stats are bad
fluxReactor = new VariableReactor("flux-reactor"){{
requirements(Category.power, with(Items.graphite, 300, Items.carbide, 200, Items.oxide, 100, Items.silicon, 600, Items.surgeAlloy, 300));
powerProduction = 140f;
powerProduction = 120f;
maxHeat = 150f;
consumeLiquid(Liquids.cyanogen, 9f / 60f);

View File

@ -52,6 +52,7 @@ public class Liquids{
capPuddles = false;
hidden = true;
spreadTarget = Liquids.water;
moveThroughBlocks = true;
colorFrom = Color.valueOf("e8803f");
colorTo = Color.valueOf("8c1225");

View File

@ -61,7 +61,7 @@ abstract class PuddleComp implements Posc, Puddlec, Drawc{
int targets = 0;
for(Point2 point : Geometry.d4){
Tile other = world.tile(tile.x + point.x, tile.y + point.y);
if(other != null && other.block() == Blocks.air){
if(other != null && (other.block() == Blocks.air || liquid.moveThroughBlocks)){
targets ++;
Puddles.deposit(other, tile, liquid, deposited, false);
}

View File

@ -45,6 +45,8 @@ public class Liquid extends UnlockableContent implements Senseable{
public float explosiveness;
/** if false, this liquid cannot be a coolant */
public boolean coolant = true;
/** if true, this liquid can move through blocks as a puddle. */
public boolean moveThroughBlocks = false;
/** The associated status effect. */
public StatusEffect effect = StatusEffects.none;
/** Effect shown in puddles. */

View File

@ -21,6 +21,8 @@ public class ConsumeGenerator extends PowerGenerator{
public float generateEffectRange = 3f;
public @Nullable LiquidStack outputLiquid;
/** If true, this block explodes when outputLiquid exceeds capacity. */
public boolean explodeOnFull = false;
public @Nullable ConsumeItemFilter filterItem;
public @Nullable ConsumeLiquidFilter filterLiquid;
@ -48,6 +50,10 @@ public class ConsumeGenerator extends PowerGenerator{
hasLiquids = true;
}
if(explodeOnFull && outputLiquid != null && explosionPuddleLiquid == null){
explosionPuddleLiquid = outputLiquid.liquid;
}
//TODO hardcoded
emitLight = true;
lightRadius = 65f * size;
@ -106,6 +112,10 @@ public class ConsumeGenerator extends PowerGenerator{
float added = Math.min(productionEfficiency * delta() * outputLiquid.amount, liquidCapacity - liquids.get(outputLiquid.liquid));
liquids.add(outputLiquid.liquid, added);
dumpLiquid(outputLiquid.liquid);
if(explodeOnFull && liquids.get(outputLiquid.liquid) >= liquidCapacity - 0.0001f){
kill();
}
}
//generation time always goes down, but only at the end so consumeTriggerValid doesn't assume fake items

View File

@ -1,13 +1,11 @@
package mindustry.world.blocks.power;
import arc.*;
import arc.audio.*;
import arc.math.*;
import arc.struct.*;
import arc.util.*;
import arc.util.io.*;
import mindustry.content.*;
import mindustry.entities.*;
import mindustry.game.EventType.*;
import mindustry.gen.*;
import mindustry.graphics.*;
@ -16,17 +14,10 @@ import mindustry.ui.*;
import mindustry.world.draw.*;
import mindustry.world.meta.*;
import static mindustry.Vars.*;
public class ImpactReactor extends PowerGenerator{
public final int timerUse = timers++;
public float warmupSpeed = 0.001f;
public float itemDuration = 60f;
public int explosionRadius = 23;
public int explosionDamage = 1900;
public Effect explodeEffect = Fx.impactReactorExplosion;
public Sound explodeSound = Sounds.explosionbig;
public ImpactReactor(String name){
super(name);
@ -41,6 +32,12 @@ public class ImpactReactor extends PowerGenerator{
envEnabled = Env.any;
drawer = new DrawMulti(new DrawRegion("-bottom"), new DrawPlasma(), new DrawDefault());
explosionShake = 6f;
explosionShakeDuration = 16f;
explosionDamage = 1900 * 4;
explodeEffect = Fx.impactReactorExplosion;
explodeSound = Sounds.explosionbig;
}
@Override
@ -114,16 +111,10 @@ public class ImpactReactor extends PowerGenerator{
}
@Override
public void onDestroyed(){
super.onDestroyed();
if(warmup < 0.3f || !state.rules.reactorExplosions) return;
Damage.damage(x, y, explosionRadius * tilesize, explosionDamage * 4);
Effect.shake(6f, 16f, x, y);
explodeEffect.at(this);
explodeSound.at(this);
public void createExplosion(){
if(warmup >= 0.3f){
super.createExplosion();
}
}
@Override

View File

@ -1,7 +1,6 @@
package mindustry.world.blocks.power;
import arc.*;
import arc.audio.*;
import arc.graphics.*;
import arc.graphics.g2d.*;
import arc.math.*;
@ -10,7 +9,6 @@ import arc.util.*;
import arc.util.io.*;
import mindustry.annotations.Annotations.*;
import mindustry.content.*;
import mindustry.entities.*;
import mindustry.game.EventType.*;
import mindustry.gen.*;
import mindustry.graphics.*;
@ -27,8 +25,6 @@ public class NuclearReactor extends PowerGenerator{
public Color lightColor = Color.valueOf("7f19ea");
public Color coolColor = new Color(1, 1, 1, 0f);
public Color hotColor = Color.valueOf("ff9575a3");
public Effect explodeEffect = Fx.reactorExplosion;
public Sound explodeSound = Sounds.explosionbig;
/** ticks to consume 1 fuel */
public float itemDuration = 120;
/** heating per frame * fullness */
@ -37,8 +33,7 @@ public class NuclearReactor extends PowerGenerator{
public float smokeThreshold = 0.3f;
/** heat threshold at which lights start flashing */
public float flashThreshold = 0.46f;
public int explosionRadius = 19;
public int explosionDamage = 1250;
/** heat removed per unit of coolant */
public float coolantPower = 0.5f;
public float smoothLight;
@ -58,6 +53,15 @@ public class NuclearReactor extends PowerGenerator{
flags = EnumSet.of(BlockFlag.reactor, BlockFlag.generator);
schematicPriority = -5;
envEnabled = Env.any;
explosionShake = 6f;
explosionShakeDuration = 16f;
explosionRadius = 19;
explosionDamage = 1250 * 4;
explodeEffect = Fx.reactorExplosion;
explodeSound = Sounds.explosionbig;
}
@Override
@ -124,19 +128,10 @@ public class NuclearReactor extends PowerGenerator{
}
@Override
public void onDestroyed(){
super.onDestroyed();
int fuel = items.get(fuelItem);
if((fuel < 5 && heat < 0.5f) || !state.rules.reactorExplosions) return;
Effect.shake(6f, 16f, x, y);
// * ((float)fuel / itemCapacity) to scale based on fullness
Damage.damage(x, y, explosionRadius * tilesize, explosionDamage * 4);
explodeEffect.at(this);
explodeSound.at(this);
public void createExplosion(){
if(items.get(fuelItem) >= 5 && heat >= 0.5f){
super.createExplosion();
}
}
@Override

View File

@ -1,24 +1,43 @@
package mindustry.world.blocks.power;
import arc.*;
import arc.audio.*;
import arc.graphics.g2d.*;
import arc.math.*;
import arc.struct.*;
import arc.util.*;
import arc.util.io.*;
import mindustry.content.*;
import mindustry.entities.*;
import mindustry.entities.units.*;
import mindustry.gen.*;
import mindustry.graphics.*;
import mindustry.type.*;
import mindustry.ui.*;
import mindustry.world.*;
import mindustry.world.draw.*;
import mindustry.world.meta.*;
import static mindustry.Vars.*;
public class PowerGenerator extends PowerDistributor{
/** The amount of power produced per tick in case of an efficiency of 1.0, which represents 100%. */
public float powerProduction;
public Stat generationType = Stat.basePowerGeneration;
public DrawBlock drawer = new DrawDefault();
public int explosionRadius = 12;
public int explosionDamage = 0;
public Effect explodeEffect = Fx.none;
public Sound explodeSound = Sounds.none;
public int explosionPuddles = 10;
public float explosionPuddleRange = tilesize * 2f;
public float explosionPuddleAmount = 100f;
public @Nullable Liquid explosionPuddleLiquid;
public float explosionShake = 0f, explosionShakeDuration = 6f;
public PowerGenerator(String name){
super(name);
sync = true;
@ -81,6 +100,36 @@ public class PowerGenerator extends PowerDistributor{
return productionEfficiency;
}
@Override
public void onDestroyed(){
super.onDestroyed();
if(state.rules.reactorExplosions){
createExplosion();
}
}
public void createExplosion(){
if(explosionDamage > 0){
Damage.damage(x, y, explosionRadius * tilesize, explosionDamage);
}
explodeEffect.at(this);
explodeSound.at(this);
if(explosionPuddleLiquid != null){
for(int i = 0; i < explosionPuddles; i++){
Tmp.v1.trns(Mathf.random(360f), Mathf.random(explosionPuddleRange));
Tile tile = world.tileWorld(x + Tmp.v1.x, y + Tmp.v1.y);
Puddles.deposit(tile, explosionPuddleLiquid, explosionPuddleAmount);
}
}
if(explosionShake > 0){
Effect.shake(explosionShake, explosionShakeDuration, this);
}
}
@Override
public void drawLight(){
super.drawLight();

View File

@ -1,7 +1,6 @@
package mindustry.world.blocks.power;
import arc.*;
import arc.audio.*;
import arc.graphics.*;
import arc.graphics.g2d.*;
import arc.math.*;
@ -13,9 +12,7 @@ import mindustry.entities.*;
import mindustry.entities.effect.*;
import mindustry.gen.*;
import mindustry.graphics.*;
import mindustry.type.*;
import mindustry.ui.*;
import mindustry.world.*;
import mindustry.world.blocks.heat.*;
import static mindustry.Vars.*;
@ -32,22 +29,23 @@ public class VariableReactor extends PowerGenerator{
public float flashThreshold = 0.01f, flashAlpha = 0.4f, flashSpeed = 7f;
public Color flashColor1 = Color.red, flashColor2 = Color.valueOf("89e8b6");
public int explosionRadius = 12;
public int explosionDamage = 1000;
public Effect explodeEffect = new MultiEffect(Fx.bigShockwave, new WrapEffect(Fx.titanSmoke, Color.valueOf("e3ae6f")));
public Sound explodeSound = Sounds.explosionbig;
public int puddles = 70;
public float puddleRange = tilesize * 6f;
public Liquid puddleLiquid = Liquids.slag;
public float puddleAmount = 100f;
public @Load("@-lights") TextureRegion lightsRegion;
public VariableReactor(String name){
super(name);
powerProduction = 20f;
rebuildable = false;
explosionRadius = 12;
explosionDamage = 1000;
explodeEffect = new MultiEffect(Fx.bigShockwave, new WrapEffect(Fx.titanSmoke, Color.valueOf("e3ae6f")));
explodeSound = Sounds.explosionbig;
explosionPuddles = 70;
explosionPuddleRange = tilesize * 6f;
explosionPuddleLiquid = Liquids.slag;
explosionPuddleAmount = 100f;
}
@Override
@ -86,24 +84,6 @@ public class VariableReactor extends PowerGenerator{
}
}
@Override
public void onDestroyed(){
super.onDestroyed();
if(!state.rules.reactorExplosions) return;
Damage.damage(x, y, explosionRadius * tilesize, explosionDamage);
explodeEffect.at(this);
explodeSound.at(this);
for(int i = 0; i < puddles; i++){
Tmp.v1.trns(Mathf.random(360f), Mathf.random(puddleRange));
Tile tile = world.tileWorld(x + Tmp.v1.x, y + Tmp.v1.y);
Puddles.deposit(tile, puddleLiquid, puddleAmount);
}
}
@Override
public void draw(){
super.draw();