Coolant system rework
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user