Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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());
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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;
                }
            }
        }