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