int CreateRiver(TriCell origin) { int length = 0; TriCell cell = origin; TriDirection direction = TriDirection.VERT; while (!cell.IsUnderwater) { flowDirections.Clear(); for (TriDirection d = TriDirection.VERT; d <= TriDirection.RIGHT; d++) { TriCell neighbor = cell.GetNeighbor(d); if (!neighbor || neighbor.HasRiver) { continue; } int delta = neighbor.Elevation - cell.Elevation; if (delta > 0) { continue; } if (delta < 0) { flowDirections.Add(d); flowDirections.Add(d); flowDirections.Add(d); } if ( length == 1 || (d != direction.Next2() && d != direction.Previous2()) ) { flowDirections.Add(d); } flowDirections.Add(d); } if (flowDirections.Count == 0) { return(length > 1 ? length : 0); } direction = flowDirections[Random.Range(0, flowDirections.Count)]; cell.SetRiver(direction); cell.GetNeighbor(direction).SetRiver(direction); length += 1; cell = cell.GetNeighbor(direction); } return(length); }