public bool IsRiverSide(Tile t) { if (t.IsWater()) return false; if (t.IsNOfRiver || t.IsWOfRiver) return true; Tile w = GetNeighbour(t, HorizontalNeighbour.West, VerticalNeighbour.None); if (w != null && w.IsWOfRiver) return true; Tile n = GetNeighbour(t, HorizontalNeighbour.None, VerticalNeighbour.North); ; if (n != null && n.IsNOfRiver) return true; // Check diagonal adjacency to a river turn Tile s = GetNeighbour(t, HorizontalNeighbour.None, VerticalNeighbour.South); Tile e = GetNeighbour(t, HorizontalNeighbour.East, VerticalNeighbour.None); Tile sw = GetNeighbour(t, HorizontalNeighbour.West, VerticalNeighbour.South); Tile ne = GetNeighbour(t, HorizontalNeighbour.East, VerticalNeighbour.North); Tile nw = GetNeighbour(t, HorizontalNeighbour.West, VerticalNeighbour.North); if (w != null && w.IsNOfRiver && sw != null && sw.IsWOfRiver) return true; // southwestern tile is a river bend if (n != null && n.IsWOfRiver && ne != null && ne.IsNOfRiver) return true; // northeastern tile is a river bend if (nw != null && nw.IsNOfRiver && nw.IsWOfRiver) return true; // northwestern tile is a river bend if (s != null && s.IsWOfRiver && e != null && e.IsNOfRiver) return true; // southeastern tile is a river bend // Check diagonal adjacency to a river mouth if (e != null && e.IsNOfRiver && s != null && s.IsWater()) return true; if (ne != null && ne.IsNOfRiver && n != null && n.IsWater()) return true; if (w != null && w.IsNOfRiver && s != null && s.IsWater()) return true; if (nw != null && nw.IsNOfRiver && n != null && n.IsWater()) return true; if (n != null && n.IsWOfRiver && e != null && e.IsWater()) return true; if (nw != null && nw.IsWOfRiver && w != null && w.IsWater()) return true; if (s != null && s.IsWOfRiver && e != null && e.IsWater()) return true; if (sw != null && sw.IsWOfRiver && w != null && w.IsWater()) return true; return false; }
public List<Tile> GetConnectedTiles(Tile start, bool traverseImpassableLandTiles, bool traverseImpassableSeaTiles) { List<Tile> result = new List<Tile>(); foreach (Tile t in this.GetAllTiles()) t.TraversalFlag = -1; Queue<Tile> tilesToVisit = new Queue<Tile>(); tilesToVisit.Enqueue(start); start.TraversalFlag = 0; while (tilesToVisit.Count > 0) { Tile t = tilesToVisit.Dequeue(); result.Add(t); foreach (Tile n in this.GetNeighbours(t, !start.IsWater())) { if (n.TraversalFlag == -1) { bool traversable = false; if (start.IsWater()) traversable = n.IsWater() && (traverseImpassableSeaTiles || n.FeatureType != FeatureTypes.FEATURE_ICE); else if (n.IsTraversableByLand() || (traverseImpassableLandTiles && !n.IsWater())) traversable = true; if(traversable) { n.TraversalFlag = t.TraversalFlag; tilesToVisit.Enqueue(n); } } } } foreach (Tile t in this.GetAllTiles()) t.TraversalFlag = -1; return result; }