示例#1
0
 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;
 }
示例#2
0
 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;
 }