Ejemplo n.º 1
0
        public void Dismantle(bool unexcite = true)
        {
            foreach (var tile in _tile)
            {
                if (tile == null)
                {
                    continue;
                }
                tile.ExcitedGroup = null;
                if (!unexcite)
                {
                    continue;
                }
                tile.Excited = false;
                _gridAtmosphereComponent.RemoveActiveTile(tile);
            }

            _tile.Clear();
        }
Ejemplo n.º 2
0
        public void ProcessCell(int fireCount)
        {
            // Can't process a tile without air
            if (Air == null)
            {
                _gridAtmosphereComponent.RemoveActiveTile(this);
                return;
            }

            if (_archivedCycle < fireCount)
            {
                Archive(fireCount);
            }

            _currentCycle = fireCount;
            var adjacentTileLength = 0;

            foreach (var(_, enemyTile) in _adjacentTiles)
            {
                // If the tile is null or has no air, we don't do anything
                if (enemyTile?.Air == null)
                {
                    continue;
                }
                adjacentTileLength++;
                if (fireCount <= enemyTile._currentCycle)
                {
                    continue;
                }
                enemyTile.Archive(fireCount);

                var shouldShareAir = false;

                if (ExcitedGroup != null && enemyTile.ExcitedGroup != null)
                {
                    if (ExcitedGroup != enemyTile.ExcitedGroup)
                    {
                        ExcitedGroup.MergeGroups(enemyTile.ExcitedGroup);
                    }

                    shouldShareAir = true;
                }
                else if (Air.Compare(enemyTile.Air) != GasMixture.GasCompareResult.NoExchange)
                {
                    if (!enemyTile.Excited)
                    {
                        _gridAtmosphereComponent.AddActiveTile(enemyTile);
                    }

                    var excitedGroup = ExcitedGroup;
                    excitedGroup ??= enemyTile.ExcitedGroup;

                    if (excitedGroup == null)
                    {
                        excitedGroup = new ExcitedGroup();
                        excitedGroup.Initialize(_gridAtmosphereComponent);
                    }

                    if (ExcitedGroup == null)
                    {
                        excitedGroup.AddTile(this);
                    }

                    if (enemyTile.ExcitedGroup == null)
                    {
                        excitedGroup.AddTile(enemyTile);
                    }

                    shouldShareAir = true;
                }

                if (shouldShareAir)
                {
                    var difference = Air.Share(enemyTile.Air, adjacentTileLength);

                    // Space wind!
                    if (difference > 0)
                    {
                        ConsiderPressureDifference(enemyTile, difference);
                    }
                    else
                    {
                        enemyTile.ConsiderPressureDifference(this, -difference);
                    }

                    LastShareCheck();
                }
            }

            React();
            UpdateVisuals();

            if ((!(Air.Temperature > Atmospherics.MinimumTemperatureStartSuperConduction && ConsiderSuperconductivity(true))) && ExcitedGroup == null)
            {
                _gridAtmosphereComponent.RemoveActiveTile(this);
            }
        }