Beispiel #1
0
        internal void Attach(Powerline edge, IPowerable node1, IPowerable node2)
        {
            bool node1Powered = node1.HasPowerGrid() && grids.ContainsKey(node1.PowerGridInstanceID);
            bool node2Powered = node2.HasPowerGrid() && grids.ContainsKey(node2.PowerGridInstanceID);

            if (node1Powered && node2Powered)
            {
                //deprecate node2's power grid by having node1's power grid usurp it
                PowerGrid deprecatedPowergrid = grids[node2.PowerGridInstanceID];

                grids[node1.PowerGridInstanceID].Usurp(deprecatedPowergrid);

                grids.Remove(deprecatedPowergrid.PowerGridInstanceID);
            }
            else if (node1Powered)
            {
                grids[node1.PowerGridInstanceID].Add(node2);
            }
            else if (node2Powered)
            {
                grids[node2.PowerGridInstanceID].Add(node1);
            }
            else
            {
                PowerGrid newPG = new PowerGrid();
                grids.Add(newPG.PowerGridInstanceID, newPG);
                newPG.Add(node1);
                newPG.Add(node2);
            }

            AddEdge(edge, node1);
            AddEdge(edge, node2);
        }
Beispiel #2
0
        private void BuildNewPowerGrid(IPowerable node1)
        {
            PowerGrid newPG = new PowerGrid();
            Dictionary <IPowerable, bool> visited = new Dictionary <IPowerable, bool>();

            BuildPowerGridVisitPowerNodes(node1, newPG, visited);

            grids.Add(newPG.PowerGridInstanceID, newPG);
        }
Beispiel #3
0
        internal void Add(Habitat h)
        {
            if (!h.HasPowerGrid())
            {
                PowerGrid newPG = new PowerGrid();
                grids.Add(newPG.PowerGridInstanceID, newPG);
                newPG.Add(h);
            }

            h.OnPowerChanged();
        }
Beispiel #4
0
        /// <summary>
        /// Take all the children of the other powergrid
        /// </summary>
        /// <param name="other"></param>
        internal void Usurp(PowerGrid other)
        {
            this.Data += other.Data;
            other.Consumers.ForEach(SetPowerableParentToMe);
            Consumers.AddRange(other.Consumers);

            other.Producers.ForEach(SetPowerableParentToMe);
            Producers.AddRange(other.Producers);
            //since variable producers are just producers, we don't need to set powerable parent on them all
            VariableProducers.AddRange(other.VariableProducers);

            other.Batteries.ForEach(SetPowerableParentToMe);
            Batteries.AddRange(other.Batteries);
        }
Beispiel #5
0
        private void BuildPowerGridVisitPowerNodes(IPowerable parentNode, PowerGrid parentGrid, Dictionary <IPowerable, bool> visited)
        {
            parentGrid.Add(parentNode);
            visited.Add(parentNode, true);

            foreach (Powerline edge in Edges[parentNode])
            {
#pragma warning disable CS0253 // Possible unintended reference comparison; right hand side needs cast
                IPowerable child = (edge.Data.From == parentNode) ? edge.Data.To as IPowerable : edge.Data.From as IPowerable;
#pragma warning restore CS0253 // Possible unintended reference comparison; right hand side needs cast

                if (!visited.ContainsKey(child))
                {
                    BuildPowerGridVisitPowerNodes(child, parentGrid, visited);
                }
            }
        }
Beispiel #6
0
        internal void Detach(Powerline edge, IPowerable node1, IPowerable node2)
        {
            PowerGrid splittingPowerGrid = grids[node1.PowerGridInstanceID];

            //let's take care of the easy cases first
            if (Edges[node1].Count == 1 && Edges[node2].Count == 1) //both are each other's leaf
            {
                //so set them both as "unpowered"
                splittingPowerGrid.Remove(node1);
                splittingPowerGrid.Remove(node2);
                Edges.Remove(node1);
                Edges.Remove(node2);
                //and remove this power grid completely
                grids.Clear();
                grids.Remove(splittingPowerGrid.PowerGridInstanceID);
            }
            else if (Edges[node1].Count == 1) //node 1 is a leaf
            {
                splittingPowerGrid.Remove(node1);
                Edges.Remove(node1);
                Edges[node2].Remove(edge);
            }
            else if (Edges[node2].Count == 1) //node 2 is a leaf
            {
                splittingPowerGrid.Remove(node2);
                Edges.Remove(node2);
                Edges[node1].Remove(edge);
            }
            else //node 1 and 2 are connected to a larger graph
            {
                Edges[node1].Remove(edge);
                Edges[node2].Remove(edge);

                BuildNewPowerGrid(node1);
                BuildNewPowerGrid(node2);

                splittingPowerGrid.Clear();
                grids.Remove(splittingPowerGrid.PowerGridInstanceID);
            }
        }