public GasMixture Clean(BloodstreamComponent bloodstream) { var gasMixture = new GasMixture(bloodstream.Air.Volume) { Temperature = bloodstream.Air.Temperature }; for (Gas gas = 0; gas < (Gas)Atmospherics.TotalNumberOfGases; gas++) { float amount; var molesInBlood = bloodstream.Air.GetMoles(gas); if (!NeedsGases.TryGetValue(gas, out var needed)) { amount = molesInBlood; } else { var overflowThreshold = needed * 1.5f; amount = molesInBlood > overflowThreshold ? molesInBlood - overflowThreshold : 0; } gasMixture.AdjustMoles(gas, amount); bloodstream.Air.AdjustMoles(gas, -amount); } return(gasMixture); }
private float GasProducedMultiplier(Gas gas, float usedAverage) { if (!NeedsGases.TryGetValue(gas, out var needs) || !ProducesGases.TryGetValue(gas, out var produces)) { return(0); } return(needs * produces * usedAverage); }
private float SuffocatingPercentage() { var percentages = new float[Atmospherics.TotalNumberOfGases]; foreach (var(gas, deficit) in DeficitGases) { if (!NeedsGases.TryGetValue(gas, out var needed)) { percentages[(int)gas] = 1; continue; } percentages[(int)gas] = deficit / needed; } return(percentages.Average()); }
public GasMixture Clean(BloodstreamComponent bloodstream, float pressure = 100) { var gasMixture = new GasMixture(bloodstream.Air.Volume); for (Gas gas = 0; gas < (Gas)Atmospherics.TotalNumberOfGases; gas++) { if (NeedsGases.TryGetValue(gas, out var needed) && bloodstream.Air.GetMoles(gas) < needed * 1.5f) { continue; } Transfer(bloodstream, gasMixture, gas, pressure); } return(gasMixture); }
private void ClampDeficit() { var deficitGases = new Dictionary <Gas, float>(DeficitGases); foreach (var(gas, deficit) in deficitGases) { if (!NeedsGases.TryGetValue(gas, out var need)) { DeficitGases.Remove(gas); continue; } if (deficit > need) { DeficitGases[gas] = need; } } }