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); }
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); }
internal void Add(Habitat h) { if (!h.HasPowerGrid()) { PowerGrid newPG = new PowerGrid(); grids.Add(newPG.PowerGridInstanceID, newPG); newPG.Add(h); } h.OnPowerChanged(); }
/// <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); }
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); } } }
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); } }