예제 #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);
        }
예제 #2
0
        public void Transfer(BloodstreamComponent @from, GasMixture to, Gas gas, float pressure)
        {
            var transfer     = new GasMixture();
            var molesInBlood = @from.Air.GetMoles(gas);

            transfer.SetMoles(gas, molesInBlood);
            transfer.ReleaseGasTo(to, pressure);

            @from.Air.Merge(transfer);
        }
예제 #3
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);
        }