Ejemplo n.º 1
0
    public static void GenerateCave(int x, WorldData worldData)
    {
        int depth = 0;

        Vector2i surface = TerrainUtilities.FindUpperMostTile(x, worldData, type => type != TileType.Empty);
        int      y       = Random.Range(surface.Y, worldData.Height);

        do
        {
            if (!(Random.value < caveContinuationChance))
            {
                continue;
            }

            depth++;
            TerrainUtilities.GenerateFuzzyCircle(minimumCaveSize, maximumCaveSize, worldData, new Vector2i(x, y), TileType.Empty);
            //Logger.Log("TerrainCaveProcessor", string.Format("Generated cave at ({0}, {1}). Current depth: {2}", x * Chunk.Size, y * Chunk.Size, depth));

            float   angle     = Random.value * MathHelper.Tau;
            Vector2 direction = new Vector2((float)Math.Cos(angle), (float)-Math.Sin(angle));

            int step = Random.Range(minimumCaveSize, maximumCaveSize);
            x += (int)Math.Floor(direction.x * step);
            y += (int)Math.Floor(direction.y * step);
        }while (depth < maximumCaveDepth);
    }
Ejemplo n.º 2
0
    public void GeneratePrairie(int startX, WorldData worldData)
    {
        int size = Random.Range(minimumSize, maximumSize);
        int endX = startX + size;

        Vector2i spotPosition = TerrainUtilities.FindUpperMostTile(startX, worldData, type => type != TileType.Empty);

        for (int x = 0; x < size; x++)
        {
            int      nx     = x + endX;
            TileType tileAt = worldData.GetTileTypeAt(nx, spotPosition.Y);
            if (tileAt == TileType.Empty)
            {
                continue;
            }

            endX = nx;
            break;
        }

        if (worldData.GetTileTypeAt(endX, spotPosition.Y) == TileType.Empty)
        {
            return;
        }

        int offset       = 0;
        int offsetSwitch = 0;
        int offsetRate   = 0;

        for (int x = startX; x < endX; x++)
        {
            for (int y = spotPosition.Y; y < worldData.Height; y++)
            {
                TileType tileAt = worldData.GetTileTypeAt(x, y + offset);
                if (tileAt == TileType.Empty)
                {
                    worldData.SetTileTypeAt(x, y + offset, TileType.NonEmpty);
                }
                else
                {
                    break;
                }
            }

            if (offsetSwitch >= offsetRate)
            {
                offsetSwitch = 0;
                offsetRate   = Random.Range(minimumOffsetSwitchRate, maximumOffsetSwitchRate);
                offset       = Random.Range(minimumOffset, maximumOffset);
            }
            else
            {
                offsetSwitch++;
            }
        }
    }
Ejemplo n.º 3
0
    private static void GenerateCanyon(int startX, WorldData worldData)
    {
        int steps    = Random.Range(minimumCanyonSteps, maximumCanyonSteps);
        int currentX = startX;

        for (int i = 0; i < steps; i++)
        {
            int radius = Random.Range(minimumCanyonSize, maximumCanyonSize);

            int pivot = Random.Range(-radius, radius);
            int x     = currentX + pivot;

            Vector2i spot = TerrainUtilities.FindUpperMostTile(x, worldData, type => type != TileType.Empty);
            TerrainUtilities.GenerateFuzzyCircle(minimumCanyonSize, maximumCanyonSize, worldData, spot, TileType.Empty);

            currentX = x;
        }
    }
Ejemplo n.º 4
0
    private static void GenerateValley(int startX, WorldData worldData)
    {
        int steps    = Random.Range(minimumValleySteps, maximumValleySteps);
        int currentX = startX;

        for (int i = 0; i < steps; i++)
        {
            int radius = Random.Range(minimumValleySize, maximumValleySize);

            int pivot = Random.Range(-radius, radius);
            int x     = currentX + pivot;

            Vector2i spot     = TerrainUtilities.FindUpperMostTile(x, worldData, type => type != TileType.Empty);
            TileType spotType = Random.value < valleyExtrusionChance ? TileType.NonEmpty : TileType.Empty;
            TerrainUtilities.GenerateFuzzyCircle(minimumValleySize, maximumValleySize, worldData, spot, spotType);

            currentX = x;
        }
    }