예제 #1
0
        public void VentContents()
        {
            var metaDataLayer = MatrixManager.AtPoint(Vector3Int.RoundToInt(transform.position), true).MetaDataLayer;

            Vector3Int   localPosition = transform.localPosition.RoundToInt();
            MetaDataNode node          = metaDataLayer.Get(localPosition, false);

            float deltaPressure = Mathf.Min(GasMix.Pressure, ReleasePressure) - node.GasMix.Pressure;

            if (deltaPressure > 0)
            {
                float ratio = deltaPressure * Time.deltaTime;

                GasMix.TransferGas(node.GasMix, GasMix, ratio);

                metaDataLayer.UpdateSystemsAt(localPosition, SystemType.AtmosSystem);

                Volume      = GasMix.Volume;
                Temperature = GasMix.Temperature;

                foreach (Gas gas in Gas.All)
                {
                    Gases[gas] = GasMix.Gases[gas];
                }
            }
        }
예제 #2
0
        public void SpillContent(Tuple <ReagentMix, GasMix> ToSpill)
        {
            if (pipeNode == null && MonoPipe == null)
            {
                return;
            }

            Vector3Int ZeroedLocation = Vector3Int.zero;

            if (pipeNode != null)
            {
                ZeroedLocation = pipeNode.NodeLocation;
            }
            else
            {
                ZeroedLocation = MonoPipe.MatrixPos;
            }

            ZeroedLocation.z = 0;
            var tileWorldPosition = MatrixManager.LocalToWorld(ZeroedLocation, matrix).RoundToInt();

            MatrixManager.ReagentReact(ToSpill.Item1, tileWorldPosition);
            MetaDataLayer metaDataLayer = MatrixManager.AtPoint(tileWorldPosition, true).MetaDataLayer;

            if (pipeNode != null)
            {
                GasMix.TransferGas(pipeNode.IsOn.GasMix, ToSpill.Item2, ToSpill.Item2.Moles);
            }
            else
            {
                GasMix.TransferGas(matrix.GetMetaDataNode(ZeroedLocation).GasMix, ToSpill.Item2, ToSpill.Item2.Moles);
            }
            metaDataLayer.UpdateSystemsAt(ZeroedLocation, SystemType.AtmosSystem);
        }
예제 #3
0
        private void CheckAtmos()
        {
            // FIXME I'm just handling the exception here, I'm no atmos nerd so I don't know what's happening.
            // maybe it is just an initialization order problem?
            if (metaNode == null)
            {
                Logger.LogError("Scrubber found metadaNode to be null. Returning with no op.", Category.Atmos);
                return;
            }

            if (SelfSufficient == false)
            {
                var pressureDensity = pipeData.mixAndVolume.Density();

                if (pressureDensity.y > MaxInternalPressure || metaNode.GasMix.Pressure < MMinimumPressure)
                {
                    return;
                }
            }
            else
            {
                if (metaNode.GasMix.Pressure < MMinimumPressure)
                {
                    return;
                }
            }

            if (metaNode.GasMix.Pressure == 0)
            {
                return;
            }

            float available = MMinimumPressure / metaNode.GasMix.Pressure * metaNode.GasMix.Moles;

            if (available < 0)
            {
                return;
            }

            if (MaxTransferMoles < available)
            {
                available = MaxTransferMoles;
            }

            var    gasOnNode = metaNode.GasMix;
            GasMix pipeMix;

            if (SelfSufficient)
            {
                pipeMix = GasMix.NewGasMix(GasMixes.Air);                 //TODO: get some immutable gasmix to avoid GC
            }
            else
            {
                pipeMix = pipeData.mixAndVolume.GetGasMix();
            }

            GasMix.TransferGas(pipeMix, gasOnNode, available);

            metaDataLayer.UpdateSystemsAt(registerTile.LocalPositionServer, SystemType.AtmosSystem);
        }
예제 #4
0
        private void ReleaseContentsInstantly()
        {
            MetaDataLayer metaDataLayer = MatrixManager.AtPoint(WorldPosition, true).MetaDataLayer;
            MetaDataNode  node          = metaDataLayer.Get(LocalPosition, false);

            GasMix.TransferGas(node.GasMix, GasMix, GasMix.Moles);
            metaDataLayer.UpdateSystemsAt(LocalPosition, SystemType.AtmosSystem);
        }
예제 #5
0
 private void TransferGas(GasMix pipeMix, float molesTransferred)
 {
     if (molesTransferred > pipeMix.Moles)
     {
         molesTransferred = pipeMix.Moles;
     }
     GasMix.TransferGas(metaNode.GasMix, pipeMix, molesTransferred);
 }
예제 #6
0
        public override void TickUpdate()
        {
            pipeData.mixAndVolume.EqualiseWithOutputs(pipeData.Outputs);

            if (isOperating)
            {
                GasMix.TransferGas(targetMix, sourceMix, molesRate * Effectiveness);
                metaDataLayer.UpdateSystemsAt(registerTile.LocalPositionServer, SystemType.AtmosSystem);
            }
        }
예제 #7
0
        private void CheckAtmos()
        {
            if (SelfSufficient == false)
            {
                var pressureDensity = pipeData.mixAndVolume.Density();

                if (pressureDensity.y > MaxInternalPressure || metaNode.GasMix.Pressure < MMinimumPressure)
                {
                    return;
                }
            }
            else
            {
                if (metaNode.GasMix.Pressure < MMinimumPressure)
                {
                    return;
                }
            }

            if (metaNode.GasMix.Pressure == 0)
            {
                return;
            }

            float available = MMinimumPressure / metaNode.GasMix.Pressure * metaNode.GasMix.Moles;

            if (available < 0)
            {
                return;
            }

            if (MaxTransferMoles < available)
            {
                available = MaxTransferMoles;
            }

            var    gasOnNode = metaNode.GasMix;
            GasMix pipeMix;

            if (SelfSufficient)
            {
                pipeMix = GasMix.NewGasMix(GasMixes.Air);                 //TODO: get some immutable gasmix to avoid GC
            }
            else
            {
                pipeMix = pipeData.mixAndVolume.GetGasMix();
            }

            GasMix.TransferGas(pipeMix, gasOnNode, available);

            metaDataLayer.UpdateSystemsAt(registerTile.LocalPositionServer, SystemType.AtmosSystem);
        }
예제 #8
0
        private void CheckAtmos()
        {
            // FIXME I'm just handling the exception here, I'm no atmos nerd so I don't know what's happening.
            // maybe it is just an initialization order problem?
            if (metaNode == null)
            {
                Logger.LogError("Airvent found metadaNode to be null. Returning with no op.", Category.Atmos);
                return;
            }

            //metaNode.GasMix = pipeData.mixAndVolume.EqualiseWithExternal(metaNode.GasMix);
            if (metaNode.GasMix.Pressure > MaxOutletPressure)
            {
                return;
            }

            float molesTransferred;

            if (metaNode.GasMix.Pressure != 0)
            {
                molesTransferred = ((MaxOutletPressure / metaNode.GasMix.Pressure) * metaNode.GasMix.Moles) - metaNode.GasMix.Moles;
                if (MaxTransferMoles < molesTransferred)
                {
                    molesTransferred = MaxTransferMoles;
                }
            }
            else
            {
                molesTransferred = MaxTransferMoles;
            }

            GasMix pipeMix;

            if (SelfSufficient)
            {
                pipeMix = GasMix.NewGasMix(GasMixes.Air);                 //TODO: get some immutable gasmix to avoid GC
                if (molesTransferred > GasMixes.Air.Moles)
                {
                    molesTransferred = GasMixes.Air.Moles;
                }
            }
            else
            {
                pipeMix = pipeData.mixAndVolume.GetGasMix();
                if (molesTransferred > pipeMix.Moles)
                {
                    molesTransferred = pipeMix.Moles;
                }
            }
            GasMix.TransferGas(metaNode.GasMix, pipeMix, molesTransferred);
            metaDataLayer.UpdateSystemsAt(registerTile.LocalPositionServer, SystemType.AtmosSystem);
        }
예제 #9
0
        private void ModeSiphon()
        {
            float moles = metaNode.GasMix.Moles * (IsExpandedRange ? 0.40f : 0.05f) * Effectiveness;             // siphon a portion

            moles = moles.Clamp(0, nominalMolesTransferCap);

            if (moles.Approx(0))
            {
                return;
            }

            GasMix.TransferGas(pipeMix, metaNode.GasMix, moles);
        }
예제 #10
0
        private void CheckAtmos()
        {
            if (SelfSufficient == false)
            {
                var pressureDensity = pipeData.mixAndVolume.Density();

                if (pressureDensity.y > MaxInternalPressure || metaNode.GasMix.Pressure < MMinimumPressure)
                {
                    return;
                }
            }
            else
            {
                if (metaNode.GasMix.Pressure < MMinimumPressure)
                {
                    return;
                }
            }

            if (metaNode.GasMix.Pressure == 0)
            {
                return;
            }

            float available = MMinimumPressure / metaNode.GasMix.Pressure * metaNode.GasMix.Moles;

            if (available < 0)
            {
                return;
            }

            if (MaxTransferMoles < available)
            {
                available = MaxTransferMoles;
            }

            var gasOnNode = metaNode.GasMix;

            if (SelfSufficient)
            {
                GasMix.TransferGas(selfSufficientGas, gasOnNode, available);
                selfSufficientGas.Copy(GasMixes.BaseAirMix);
            }
            else
            {
                var pipeMix = pipeData.mixAndVolume.GetGasMix();
                GasMix.TransferGas(pipeMix, gasOnNode, available);
            }

            metaDataLayer.UpdateSystemsAt(registerTile.LocalPositionServer, SystemType.AtmosSystem);
        }
예제 #11
0
        private void Operate()
        {
            GasMix sourceGasMix = pipeMix;
            GasMix targetGasMix = metaNode.GasMix;

            if (OperatingMode == Mode.In)
            {
                sourceGasMix = metaNode.GasMix;
                targetGasMix = pipeMix;
            }

            GasMix.TransferGas(targetGasMix, sourceGasMix, GetTransferableMoles(sourceGasMix));
            metaDataLayer.UpdateSystemsAt(registerTile.LocalPositionServer, SystemType.AtmosSystem);
        }
예제 #12
0
        private void OperateAirPump()
        {
            MetaDataLayer metadata = registerObject.Matrix.MetaDataLayer;
            GasMix        tileMix  = metadata.Get(registerObject.LocalPositionServer, false).GasMix;

            // TODO: add voltage multiplier when bins are powered
            var molesToTransfer = (tileMix.Moles - (tileMix.Moles * (CHARGED_PRESSURE / gasContainer.GasMix.Pressure))) * -1;

            molesToTransfer *= 0.5f;

            GasMix.TransferGas(gasContainer.GasMix, tileMix, molesToTransfer.Clamp(0, 8));
            metadata.UpdateSystemsAt(registerObject.LocalPositionServer, SystemType.AtmosSystem);

            chargePressure = gasContainer.GasMix.Pressure;
        }
예제 #13
0
        public override void TickUpdate()
        {
            pipeData.mixAndVolume.EqualiseWithOutputs(pipeData.Outputs);

            if (isOperating)
            {
                if (operatingMode == Mode.Extracting && pipeData.mixAndVolume.Density().y > MaxInternalPressure)
                {
                    return;
                }

                GasMix.TransferGas(targetMix, sourceMix, molesRate * Effectiveness);
                metaDataLayer.UpdateSystemsAt(registerTile.LocalPositionServer, SystemType.AtmosSystem);
            }
        }
예제 #14
0
        private void CheckAtmos()
        {
            //metaNode.GasMix = pipeData.mixAndVolume.EqualiseWithExternal(metaNode.GasMix);
            if (metaNode.GasMix.Pressure > MaxOutletPressure)
            {
                return;
            }

            float molesTransferred;

            if (metaNode.GasMix.Pressure != 0)
            {
                molesTransferred = ((MaxOutletPressure / metaNode.GasMix.Pressure) * metaNode.GasMix.Moles) - metaNode.GasMix.Moles;
                if (MaxTransferMoles < molesTransferred)
                {
                    molesTransferred = MaxTransferMoles;
                }
            }
            else
            {
                molesTransferred = MaxTransferMoles;
            }

            GasMix pipeMix;

            if (SelfSufficient)
            {
                pipeMix = GasMix.NewGasMix(GasMixes.Air);                 //TODO: get some immutable gasmix to avoid GC
                if (molesTransferred > GasMixes.Air.Moles)
                {
                    molesTransferred = GasMixes.Air.Moles;
                }
            }
            else
            {
                pipeMix = pipeData.mixAndVolume.GetGasMix();
                if (molesTransferred > pipeMix.Moles)
                {
                    molesTransferred = pipeMix.Moles;
                }
            }
            GasMix.TransferGas(metaNode.GasMix, pipeMix, molesTransferred);
            metaDataLayer.UpdateSystemsAt(registerTile.LocalPositionServer, SystemType.AtmosSystem);
        }