Coolant system rework

This commit is contained in:
Anuken
2022-02-15 19:11:49 -05:00
parent 390c76a84f
commit 0102ade759
16 changed files with 86 additions and 71 deletions
@@ -7,7 +7,6 @@ import mindustry.entities.*;
import mindustry.gen.*;
import mindustry.graphics.*;
import mindustry.logic.*;
import mindustry.type.*;
import mindustry.world.*;
import mindustry.world.consumers.*;
import mindustry.world.meta.*;
@@ -19,17 +18,12 @@ public class BaseTurret extends Block{
public float placeOverlapMargin = 8 * 7f;
public float rotateSpeed = 5;
public float coolantUsage = 0.2f;
//TODO
public boolean acceptCoolant = true;
/** Effect displayed when coolant is used. */
public Effect coolEffect = Fx.fuelburn;
/** How much reload is lowered by for each unit of liquid of heat capacity. */
public float coolantMultiplier = 5f;
/** Liquid that is used by coolant; null to use default. */
public @Nullable Liquid coolantOverride;
protected @Nullable ConsumeLiquidBase coolantConsumer;
/** If not null, this consumer will be used for coolant. */
public @Nullable ConsumeLiquidBase coolant;
public BaseTurret(String name){
super(name);
@@ -44,18 +38,14 @@ public class BaseTurret extends Block{
@Override
public void init(){
//TODO bad
if(acceptCoolant && findConsumer(f -> f instanceof ConsumeLiquidBase) == null){
hasLiquids = true;
consume(coolantOverride != null ? new ConsumeLiquid(coolantOverride, coolantUsage) : new ConsumeCoolant(coolantUsage)).update(false).boost();
//just makes things a little more convenient
if(coolant != null){
coolant.update = false;
coolant.booster = true;
}
placeOverlapRange = Math.max(placeOverlapRange, range + placeOverlapMargin);
super.init();
if(acceptCoolant){
coolantConsumer = findConsumer(c -> c instanceof ConsumeLiquidBase);
}
}
@Override
@@ -14,7 +14,6 @@ public class ContinuousLiquidTurret extends ContinuousTurret{
public ContinuousLiquidTurret(String name){
super(name);
acceptCoolant = false;
hasLiquids = true;
//TODO
loopSound = Sounds.minebeam;
@@ -18,7 +18,6 @@ public class ContinuousTurret extends Turret{
coolantMultiplier = 1f;
envEnabled |= Env.space;
acceptCoolant = false;
displayAmmoMultiplier = false;
}
@@ -26,7 +26,7 @@ public class LaserTurret extends PowerTurret{
super.setStats();
stats.remove(Stat.booster);
stats.add(Stat.input, StatValues.boosters(reloadTime, coolantConsumer.amount, coolantMultiplier, false, this::consumesLiquid));
stats.add(Stat.input, StatValues.boosters(reloadTime, coolant.amount, coolantMultiplier, false, this::consumesLiquid));
}
public class LaserTurretBuild extends PowerTurretBuild{
@@ -65,9 +65,9 @@ public class LaserTurret extends PowerTurret{
}
}else if(reload > 0){
wasShooting = true;
//TODO does not handle multi liquid req?
Liquid liquid = liquids.current();
float maxUsed = coolantConsumer.amount;
float maxUsed = coolant.amount;
float used = (cheating() ? maxUsed : Math.min(liquids.get(liquid), maxUsed)) * delta();
reload -= used * liquid.heatCapacity * coolantMultiplier;
liquids.remove(liquid, used);
@@ -19,7 +19,6 @@ public class LiquidTurret extends Turret{
public LiquidTurret(String name){
super(name);
acceptCoolant = false;
hasLiquids = true;
loopSound = Sounds.spray;
shootSound = Sounds.none;
@@ -38,8 +38,6 @@ public class PointDefenseTurret extends ReloadTurret{
reloadTime = 30f;
coolantMultiplier = 2f;
//disabled due to version mismatch problems
acceptCoolant = false;
}
@Override
@@ -70,7 +68,7 @@ public class PointDefenseTurret extends ReloadTurret{
target = null;
}
if(acceptCoolant){
if(coolant != null){
updateCooling();
}
@@ -99,6 +97,11 @@ public class PointDefenseTurret extends ReloadTurret{
}
}
@Override
public boolean shouldConsume(){
return super.shouldConsume() && target != null;
}
@Override
public void draw(){
Draw.rect(baseRegion, x, y);
@@ -1,8 +1,6 @@
package mindustry.world.blocks.defense.turrets;
import arc.math.*;
import arc.util.*;
import mindustry.type.*;
import mindustry.world.meta.*;
import static mindustry.Vars.*;
@@ -18,8 +16,8 @@ public class ReloadTurret extends BaseTurret{
public void setStats(){
super.setStats();
if(acceptCoolant && coolantConsumer != null){
stats.add(Stat.booster, StatValues.boosters(reloadTime, coolantConsumer.amount, coolantMultiplier, true, l -> l.coolant && consumesLiquid(l)));
if(coolant != null){
stats.add(Stat.booster, StatValues.boosters(reloadTime, coolant.amount, coolantMultiplier, true, l -> l.coolant && consumesLiquid(l)));
}
}
@@ -34,15 +32,11 @@ public class ReloadTurret extends BaseTurret{
}
protected void updateCooling(){
if(reload < reloadTime && acceptCoolant){
float maxUsed = coolantConsumer.amount;
Liquid liquid = liquids.current();
if(reload < reloadTime && coolant != null && coolant.valid(this)){
coolant.update(this);
reload += coolant.amount * edelta() * (filterConsLiquid == null ? 1f : filterConsLiquid.heatCapacity) * coolantMultiplier;
float used = Math.min(liquids.get(liquid), maxUsed * Time.delta) * baseReloadSpeed();
reload += used * liquid.heatCapacity * coolantMultiplier;
liquids.remove(liquid, used);
if(Mathf.chance(0.06 * used)){
if(Mathf.chance(0.06 * coolant.amount)){
coolEffect.at(x + Mathf.range(size * tilesize / 2f), y + Mathf.range(size * tilesize / 2f));
}
}
@@ -45,9 +45,6 @@ public class TractorBeamTurret extends BaseTurret{
rotateSpeed = 10f;
coolantMultiplier = 1f;
envEnabled |= Env.space;
//disabled due to version mismatch problems
acceptCoolant = false;
}
@Override
@@ -75,7 +72,7 @@ public class TractorBeamTurret extends BaseTurret{
public @Nullable Unit target;
public float lastX, lastY, strength;
public boolean any;
public float coolant = 1f;
public float coolantMultiplier = 1f;
@Override
public void updateTile(){
@@ -86,8 +83,8 @@ public class TractorBeamTurret extends BaseTurret{
}
//consume coolant
if(target != null && acceptCoolant){
float maxUsed = coolantConsumer.amount;
if(target != null && coolant != null){
float maxUsed = coolant.amount;
Liquid liquid = liquids.current();
@@ -99,7 +96,7 @@ public class TractorBeamTurret extends BaseTurret{
coolEffect.at(x + Mathf.range(size * tilesize / 2f), y + Mathf.range(size * tilesize / 2f));
}
coolant = 1f + (used * liquid.heatCapacity * coolantMultiplier);
coolantMultiplier = 1f + (used * liquid.heatCapacity * coolantMultiplier);
}
any = false;
@@ -134,9 +131,14 @@ public class TractorBeamTurret extends BaseTurret{
}
}
@Override
public boolean shouldConsume(){
return super.shouldConsume() && target != null;
}
@Override
public float efficiency(){
return super.efficiency() * coolant;
return super.efficiency() * coolantMultiplier;
}
@Override
@@ -381,14 +381,14 @@ public class Turret extends ReloadTurret{
}
}
if(acceptCoolant){
if(coolant != null){
updateCooling();
}
}
@Override
public void handleLiquid(Building source, Liquid liquid, float amount){
if(acceptCoolant && liquids.currentAmount() <= 0.001f){
if(coolant != null && liquids.currentAmount() <= 0.001f){
Events.fire(Trigger.turretCool);
}