예제 #1
0
        private void ExcitedGroupMerge(GridAtmosphereComponent gridAtmosphere, ExcitedGroup ourGroup, ExcitedGroup otherGroup)
        {
            DebugTools.Assert(!ourGroup.Disposed, "Excited group is disposed!");
            DebugTools.Assert(!otherGroup.Disposed, "Excited group is disposed!");
            DebugTools.Assert(gridAtmosphere.ExcitedGroups.Contains(ourGroup), "Grid Atmosphere does not contain Excited Group!");
            DebugTools.Assert(gridAtmosphere.ExcitedGroups.Contains(otherGroup), "Grid Atmosphere does not contain Excited Group!");
            var ourSize   = ourGroup.Tiles.Count;
            var otherSize = otherGroup.Tiles.Count;

            ExcitedGroup winner;
            ExcitedGroup loser;

            if (ourSize > otherSize)
            {
                winner = ourGroup;
                loser  = otherGroup;
            }
            else
            {
                winner = otherGroup;
                loser  = ourGroup;
            }

            foreach (var tile in loser.Tiles)
            {
                tile.ExcitedGroup = winner;
                winner.Tiles.Add(tile);
            }

            loser.Tiles.Clear();
            ExcitedGroupDispose(gridAtmosphere, loser);
            ExcitedGroupResetCooldowns(winner);
        }
예제 #2
0
 private void ExcitedGroupRemoveTile(ExcitedGroup excitedGroup, TileAtmosphere tile)
 {
     DebugTools.Assert(!excitedGroup.Disposed, "Excited group is disposed!");
     DebugTools.Assert(tile.ExcitedGroup == excitedGroup, "Tried to remove a tile from an excited group it's not present in!");
     tile.ExcitedGroup = null;
     excitedGroup.Tiles.Remove(tile);
 }
예제 #3
0
 private void ExcitedGroupAddTile(ExcitedGroup excitedGroup, TileAtmosphere tile)
 {
     DebugTools.Assert(!excitedGroup.Disposed, "Excited group is disposed!");
     DebugTools.Assert(tile.ExcitedGroup == null, "Tried to add a tile to an excited group when it's already in another one!");
     excitedGroup.Tiles.Add(tile);
     tile.ExcitedGroup = excitedGroup;
     ExcitedGroupResetCooldowns(excitedGroup);
 }
예제 #4
0
        private void ExcitedGroupDispose(GridAtmosphereComponent gridAtmosphere, ExcitedGroup excitedGroup)
        {
            if (excitedGroup.Disposed)
            {
                return;
            }

            DebugTools.Assert(gridAtmosphere.ExcitedGroups.Contains(excitedGroup), "Grid Atmosphere does not contain Excited Group!");

            excitedGroup.Disposed = true;

            gridAtmosphere.ExcitedGroups.Remove(excitedGroup);
            ExcitedGroupDismantle(gridAtmosphere, excitedGroup, false);
        }
예제 #5
0
        private void ExcitedGroupDismantle(GridAtmosphereComponent gridAtmosphere, ExcitedGroup excitedGroup, bool unexcite = true)
        {
            foreach (var tile in excitedGroup.Tiles)
            {
                tile.ExcitedGroup = null;

                if (!unexcite)
                {
                    continue;
                }

                RemoveActiveTile(gridAtmosphere, tile);
            }

            excitedGroup.Tiles.Clear();
        }
 public override void RemoveExcitedGroup(ExcitedGroup excitedGroup)
 {
 }
 public override void AddExcitedGroup(ExcitedGroup excitedGroup)
 {
 }
예제 #8
0
 public void RemoveExcitedGroup(ExcitedGroup excitedGroup)
 {
     _excitedGroups.Remove(excitedGroup);
 }
예제 #9
0
 public void AddExcitedGroup(ExcitedGroup excitedGroup)
 {
     _excitedGroups.Add(excitedGroup);
 }
예제 #10
0
        private void ProcessCell(GridAtmosphereComponent gridAtmosphere, TileAtmosphere tile, int fireCount)
        {
            // Can't process a tile without air
            if (tile.Air == null)
            {
                RemoveActiveTile(gridAtmosphere, tile);
                return;
            }

            if (tile.ArchivedCycle < fireCount)
            {
                Archive(tile, fireCount);
            }

            tile.CurrentCycle = fireCount;
            var adjacentTileLength = 0;

            for (var i = 0; i < Atmospherics.Directions; i++)
            {
                var direction = (AtmosDirection)(1 << i);
                if (tile.AdjacentBits.IsFlagSet(direction))
                {
                    adjacentTileLength++;
                }
            }

            for (var i = 0; i < Atmospherics.Directions; i++)
            {
                var direction = (AtmosDirection)(1 << i);
                if (!tile.AdjacentBits.IsFlagSet(direction))
                {
                    continue;
                }
                var enemyTile = tile.AdjacentTiles[i];

                // If the tile is null or has no air, we don't do anything for it.
                if (enemyTile?.Air == null)
                {
                    continue;
                }
                if (fireCount <= enemyTile.CurrentCycle)
                {
                    continue;
                }
                Archive(enemyTile, fireCount);

                var shouldShareAir = false;

                if (ExcitedGroups && tile.ExcitedGroup != null && enemyTile.ExcitedGroup != null)
                {
                    if (tile.ExcitedGroup != enemyTile.ExcitedGroup)
                    {
                        ExcitedGroupMerge(gridAtmosphere, tile.ExcitedGroup, enemyTile.ExcitedGroup);
                    }

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

                    if (ExcitedGroups)
                    {
                        var excitedGroup = tile.ExcitedGroup;
                        excitedGroup ??= enemyTile.ExcitedGroup;

                        if (excitedGroup == null)
                        {
                            excitedGroup = new ExcitedGroup();
                            gridAtmosphere.ExcitedGroups.Add(excitedGroup);
                        }

                        if (tile.ExcitedGroup == null)
                        {
                            ExcitedGroupAddTile(excitedGroup, tile);
                        }

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

                    shouldShareAir = true;
                }

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

                    if (SpaceWind)
                    {
                        if (difference > 0)
                        {
                            ConsiderPressureDifference(gridAtmosphere, tile, enemyTile, difference);
                        }
                        else
                        {
                            ConsiderPressureDifference(gridAtmosphere, enemyTile, tile, -difference);
                        }
                    }

                    LastShareCheck(tile);
                }
            }

            if (tile.Air != null)
            {
                React(tile.Air, tile);
            }

            InvalidateVisuals(tile.GridIndex, tile.GridIndices);

            var remove = true;

            if (tile.Air !.Temperature > Atmospherics.MinimumTemperatureStartSuperConduction)
            {
                if (ConsiderSuperconductivity(gridAtmosphere, tile, true))
                {
                    remove = false;
                }
            }

            if (ExcitedGroups && tile.ExcitedGroup == null && remove)
            {
                RemoveActiveTile(gridAtmosphere, tile);
            }
        }
예제 #11
0
        private void ExcitedGroupSelfBreakdown(GridAtmosphereComponent gridAtmosphere, ExcitedGroup excitedGroup)
        {
            DebugTools.Assert(!excitedGroup.Disposed, "Excited group is disposed!");
            DebugTools.Assert(gridAtmosphere.ExcitedGroups.Contains(excitedGroup), "Grid Atmosphere does not contain Excited Group!");
            var combined = new GasMixture(Atmospherics.CellVolume);

            var tileSize = excitedGroup.Tiles.Count;

            if (excitedGroup.Disposed)
            {
                return;
            }

            if (tileSize == 0)
            {
                ExcitedGroupDispose(gridAtmosphere, excitedGroup);
                return;
            }

            foreach (var tile in excitedGroup.Tiles)
            {
                if (tile?.Air == null)
                {
                    continue;
                }

                Merge(combined, tile.Air);

                if (!ExcitedGroupsSpaceIsAllConsuming || !tile.Air.Immutable)
                {
                    continue;
                }

                combined.Clear();
                break;
            }

            combined.Multiply(1 / (float)tileSize);

            foreach (var tile in excitedGroup.Tiles)
            {
                if (tile?.Air == null)
                {
                    continue;
                }
                tile.Air.CopyFromMutable(combined);
                InvalidateVisuals(tile.GridIndex, tile.GridIndices);
            }

            excitedGroup.BreakdownCooldown = 0;
        }
예제 #12
0
 private void ExcitedGroupResetCooldowns(ExcitedGroup excitedGroup)
 {
     DebugTools.Assert(!excitedGroup.Disposed, "Excited group is disposed!");
     excitedGroup.BreakdownCooldown = 0;
     excitedGroup.DismantleCooldown = 0;
 }