예제 #1
0
    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);
    }