public void FindInternalConnections(Cluster cluster) { foreach (Portal portal in cluster.GetPortals()) { FindConnections (portal, cluster, false); } }
void FindConnections(Portal portal, Cluster cluster, bool oriented) { Heap<Tile> queue = new Heap<Tile> (Cluster.size * Cluster.size); HashSet<Tile> visited = new HashSet<Tile> (); int pcount = cluster.GetPortals ().Count - 1; foreach (Tile t in portal.GetPortalTiles()) { t.distance = 0; queue.Add (t); } while (queue.size () > 0 && pcount > 0) { Tile current = queue.RemoveFirst (); visited.Add (current); Portal newPortal = current.GetPortal (); if (newPortal != null && newPortal != portal) { if (!portal.ConnectedTo (newPortal) && current.distance>0) { if (!oriented) { Portal.Connect (portal, newPortal, current.distance); } else { portal.AddNeighbour (newPortal, current.distance); } pcount--; } } foreach (Tile nb in cluster.GetNeighbours(current)) { if (nb == null || nb.cost == 255 || visited.Contains (nb)) continue; nb.distance = current.distance + 1; if (!queue.Contains (nb)) queue.Add (nb); } } }