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);
}
@@ -43,6 +43,7 @@ public class ConsumeItemFilter extends Consume{
Item item = content.item(i);
if(build.items != null && build.items.has(item) && this.filter.get(item)){
build.items.remove(item, 1);
build.filterConsItem = item;
break;
}
}
@@ -9,7 +9,7 @@ import mindustry.world.meta.*;
import static mindustry.Vars.*;
//TODO replace with ConsumeLiquids
//TODO replace with ConsumeLiquids?
public class ConsumeLiquid extends ConsumeLiquidBase{
public final Liquid liquid;
@@ -3,6 +3,7 @@ package mindustry.world.consumers;
import arc.func.*;
import arc.scene.ui.layout.*;
import arc.struct.*;
import arc.util.*;
import mindustry.gen.*;
import mindustry.type.*;
import mindustry.ui.*;
@@ -34,19 +35,38 @@ public class ConsumeLiquidFilter extends ConsumeLiquidBase{
Seq<Liquid> list = content.liquids().select(l -> !l.isHidden() && filter.get(l));
MultiReqImage image = new MultiReqImage();
list.each(liquid -> image.add(new ReqImage(liquid.uiIcon, () ->
build.liquids != null && build.liquids.current() == liquid && build.liquids.get(liquid) >= Math.max(use(build), amount * build.delta()))));
build.liquids != null && build.liquids.get(liquid) >= Math.max(use(build), amount * build.delta()))));
table.add(image).size(8 * 4);
}
@Override
public void update(Building build){
build.liquids.remove(build.liquids.current(), use(build));
Liquid liq = match(build);
build.liquids.remove(liq, use(build));
build.filterConsLiquid = liq;
}
@Override
public boolean valid(Building build){
return build != null && build.liquids != null && filter.get(build.liquids.current()) && build.liquids.currentAmount() >= use(build);
var liq = match(build);
return liq != null && build.liquids.get(liq) >= use(build);
}
@Nullable Liquid match(Building build){
if(filter.get(build.liquids.current())){
return build.liquids.current();
}
var liqs = content.liquids();
for(int i = 0; i < liqs.size; i++){
var liq = liqs.get(i);
if(filter.get(liq) && build.liquids.get(liq) > 0){
return liq;
}
}
return null;
}
@Override