35 lines
1.2 KiB
C#
35 lines
1.2 KiB
C#
using ReactorMaintenance.Simulation;
|
|
|
|
namespace ReactorMaintenance.Simulation.Effects;
|
|
|
|
public sealed class CellIntegrityEffect : ISimulationEffect
|
|
{
|
|
public CellState Apply(CellState cell)
|
|
{
|
|
var integrity = cell.Integrity;
|
|
var hazards = cell.Hazards;
|
|
|
|
if (cell is { HasPipe: true } && cell.Pressure > Balancing.Current.OverpressureThreshold)
|
|
integrity -= cell.Pressure - Balancing.Current.OverpressureThreshold;
|
|
|
|
if (hazards.Heat >= Balancing.Current.HeatIntegrityDamageThreshold || hazards.Fire)
|
|
{
|
|
integrity -= cell.HasPipe ? Balancing.Current.PipeFireIntegrityDamage : Balancing.Current.MinHazardValue;
|
|
hazards = hazards with { Stability = hazards.Stability - Balancing.Current.FireStabilityDamage };
|
|
}
|
|
|
|
cell = cell with {
|
|
Integrity = Rules.Clamp(integrity),
|
|
Hazards = hazards.Clamp()
|
|
};
|
|
|
|
if (integrity > Balancing.Current.MinHazardValue || !cell.HasPipe)
|
|
return cell;
|
|
|
|
return cell with {
|
|
LeakRate = Math.Max(cell.LeakRate, Balancing.Current.BurstLeakRate),
|
|
Flow = Balancing.Current.BrokenPipeFlow,
|
|
PipeOpen = false
|
|
};
|
|
}
|
|
} |